[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс работы с БД
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
dr.nomore
Как-то докопался до кодов PMA и выяснил что формирование условия у них состоит из чудовищного количества чудовищного кода. Это была еще нормальная, деревянная версия, но работающая на другом уровне.

Все эти методы перекатывания ddl в скрипты - колхоз. Скрипт оказывается спаян с дб намертво, это единое целое в той самой рамке, которая для вас типа уютного бложика для хомячка, без рамки вы потеряетесь как слепой без собачки-поводыря.

Рамки - для тех кто свободно жить не может.

Касательно умозаключения о расходовании ресурсов. Любая рамка заведомо и подчас на 99 процентов избыточна и пожирает ресурсы как кадавр. Не видел я что ли сырцов этих рамок.

Насчет активных записей. Вы же видели как в десктопном программировании берется control и связывается с полем в таблице в бд. Коллекция таких контролей инкапсулируется в объект с типовым набором методов как то вперед, назад, убдейт, дилейт, адд нью. Адд нью ничто иное как кнопка типа reset.

Ума не приложу почему на вебе народ тупо забыл о таких методах, которым в обед стопицот лет.

Можно этот activerecords попросить создать control и вернуть ему этот control чтобы activerecords записал данные в ячейку таблицы бд о которой он узнал из "вернутого" элемента управления?
dr.nomore
Yii wrote: CRUD (create, read, update, delete) features...

Одуреть. Это же DML - data manipulation language.

Про ресурсы.

5. Application Life Cycle
...

Не многовато?

dr.nomore
И в контроллере еще раз:


if($contact->id > 0) // update
{
$contact->isNewRecord=false;
if(($oldContact=Contact::model()->findByPk($contact->id))!==null)



Короче все через ж.

Мы же знаем что id это pk. Следовательно в модели, там где перечисляются поля на выход, должно быть $this->pk = 'id', а затем в контроллере, соответственно if($contact->pk > 0) и далее _не_ по тексту, потому что findByPk обламывается - она уже не нужна.

И вы пишите куча лишних запросов будет, и бла-бла-бла. Так вот и в модели ничего не надо прописывать вручную, потому что найти какое поле - pk - очень просто. Смотрим флаги. Если авто-инкремент - значит берем это имя, иначе смотрим дальше, если primary key - берем его, иначе смотрим дальше, если unique key - берем его и смотрим дальше.

Дальше можно по настройкам. Если в настройках написано типа use_any_key_as_pk = 1 надо попытаться составить ключ из нескольких полей. Сначала берутся типа число, типа дата, потом типа текст и все такое.

В практическом же смысле в этом поиске чего-нибудь типа ключа - смысл вредный. Таблицы нормальной БД всегда оборудованы каким-нибудь явным pk. А не нормальные БД посылаются к черту, вместе с их создателями. Таким образом заодно отсекается контингент полных идиотов с которыми все равно на форуме тех-поддержки намаешься.

Подытожим. Может класс ДБ найти ключевое поле данной таблицы? Может, элементарно. Может класс ДБ найти правило для данной таблицы в таблице правил, имя которой свободно прописывается в конфиге, который сам таблица, имя которой - единственное что _знает_ ПО вдобавок к имени БД. Может. Может класс ДБ поднять отношения данной таблицы и загрузить все остальные таблицы через запрос? Стало быть если скажем сама таблица модели имеет отношения, "моделька" сама себя поднимет за усы из болота, достанет все правила, сделает запрос, нормализует данные, выложит их в проперь - берите кто хотите и рендерите что угодно.
Aeq
Цитата
Вполне понятно выгода тут чисто синтаксическая.

Совершенно верно. Обеспечить удобный синтаксис - основная задача моего класса.

Цитата
Вот как должен выглядеть активный член класса.
$apdo->{$table}->delete($cond);

чтобы такое организовать, достаточно переопределить __get. собственно решение прям сходу напишу вам:
function __get($table) {
return $this->from($table);
}

все, теперь вы можете сделать так:
$apdo->fruits->key(123)->delete();

НО, я не хочу включать это в свой класс, потому что автокомплита не будет, + могут быть пересечения с именами свойств класса. Чтоб был автокомплит, нужен какой-то скриптик, который распарсит структуру базы и пропишет ее в какой-то ОТДЕЛЬНЫЙ класс, не вижу смысла тут все в кучу в мешать и сувать это в apdo, это уже ОТДЕЛЬНАЯ задача.

Цитата
ключ поле авто_инкремент
если ключ не найден - throw new exception ('вы хотите прикончить датабазу?');

Подобные вещи должен отлавливать класс отвечающий непосредственно за соединение, в моем случае это PDO, и если он не кидает исключение когда вставить запись не удалось, то я буду писать багрепорт создателям PDO, а не добавлять костыли в свою обертку.

Цитата
Теперь вопрос. Если name не unique key, оперировать им как ключом чревато. См исключение.
Можно сказать "так пропиши ключ вторым аргументом" и будет классу счастье. Это значит я должен ПЕРЕПИСАТЬ ручками и глазками из DDL в скрипт данные о БД. Так понятно?

Этот класс помогает строить запросы, а логика должна прописываться у вас в моделях, это уже другой уровень абстракции.
Я так понял ваше недовольство классом исходит от того что вы ждете от него, какой-то логики работы с БД, а он умеет только строить запросы + пара бонусов. Так вот это разные уровни абстракции, то что вы хотите - следующий уровень, мешать все в один класс смысла не вижу.

Цитата
Второй. Если $table родитель и там fk на потомка и удаление каскадное - все потомкам придет капец. Так и должно быть, или надо еще вопрос задать, типа "Будут удалены все записи из $referenced_table_name. Продолжить?"

Вам может и нужно задать вопрос, другому человеку не нужно, это уже дело конкретного приложения, снова другой уровень абстракции ))

Я таки продолжаю ждать от вас ссылок на проекты/библиотеки/фреймворки, в которых ваши идеи реализованы.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.