А, ясно. Тогда я тоже не понимаю, почему не наследование/трейты.В Yii модель в статическом методе создает AQ, и отдает ее, и дальше уже мы все методы включая итоговый find вызываем у AQ, а тот уже возвращает модели. Так как AQ создана статикой - у нее нет объекта AR. Благодаря этому и со скоупами фигня - они вроде как должны быть в AR, как часть бизнес-логики, а вызываются у AQ.
А в чем отличие от "классического" AR?в том и суть - в yii никакой не AR, и не table gateway, а пришей кобыле хвост,
то есть конструкция с одной стороны удобная, а с другой в рамки паттернов нифига не укладывающаяся
Тут очень понятная логика если сравнивать yii и yii2.Я вот тут посмотрел AR. А можете пояснить на пальцах, в чем плюсы разделения AR на AR+AQuery? Вот минусы с точки зрения использования - вижу, это и проблемы с автокомплитом, и излишняя магичность скоупов. Просто разделили, так как слишком много ответственности? Ну AR вообще весь такой. Тот же Фаулер гвоорит, что не видит причин выносить методы поиска в отдельный файндер из AR.
вообще, риторика в стиле "херню понаписали - в Hybernate/Symfony все сделано правильно, а остальное хрень! А ну развлеките меня" не имеет перспектив осмысленного диалогаМеня одного раздражают фразы типа "Фаулер сказал" без ссылок на точную его аргументацию? Мало ли кто что сказал.
Не спорь с верующими, себе дороже.Меня одного раздражают фразы типа "Фаулер сказал" без ссылок на точную его аргументацию? Мало ли кто что сказал.
Обычно это раздражение вызывает у тех, кто сам не читал и делать ему это лень, ибо он считает, что и так все знает, либо в крайних стадиях звездной болезни. Мне казалось, что конкретно вы не из их числа. В общем можно пойти и почитать и без проблем найти это место, разве нет? Статья про AR в P of EAA не очень большая.Меня одного раздражают фразы типа "Фаулер сказал" без ссылок на точную его аргументацию? Мало ли кто что сказал.
Мне в общем не нравится не то, что они AQ вынесли в отдельный слой, а то, что Model::find() возвращает его и дальше мы работаем именно с ним. Можно было бы через агрегацию, например, сделать. Как минимум две причины, почему мне, как разработчику, это не нравится - я сформулировал: IDE-friendly и неявность описания скоупов. Они не критичны (даже IDE можно победить, если делать ModelActiveQuery), но в чем плюсы для разработки?Тут очень понятная логика если сравнивать yii и yii2.
Решили не писать с нуля, а хорошенько переделать первую реализацию.
AQuery, это бывший CommandBuilder.
Хотя я бы вообще его выкинул, а сделал как в Laravel наборы правил.
Find-методы там именно в контексте "isomorphic schema". Примеры у Фаулера простые - статический метод, который находит в базе одну строку и возвращает new self.In an initial design for a Domain Model (116) the main choice is between Active Record and Data Mapper (165). Active Record has the primary advantage of simplicity. It's easy to build Active Records, and they are easy to understand. Their primary problem is that they work well only if the Active Record objects correspond directly to the database tables: an isomorphic schema. If your business logic is complex, you'll soon want to use your object's direct relationships, collections, inheritance, and so forth. These don't map easily onto Active Record, and adding them piecemeal gets very messy. That's what will lead you to use Data Mapper (165) instead.
А в чем принципиальное различие с той же Yii1 реализацией? Просто усложение в области find-ов, дополнительный слой работы с базой и т.п. - но это и понятно, в PoEAA все же пример, а не реальный кейс. Если вообще разбираться в том, что он пишет про DM vs AR, то там основная идея - когда модель не ложится на таблицу. Т.е. грубо говоря когда данные в модели зависят от нескольких моделей. Relation-s в AR, имхо, не то же самое - там просто ссылка на объект или массив объектов другой модели.
$self = new self;
return $self->loadById($id) ? $self : null
// find all rows satisfying the specified condition
$posts=Post::model()->findAll($condition,$params);
Угу, это как в одном малоизвестном фреймворке:Так что, фактически, разделение в yii2 - это, по сути, переход к DM. А с учетом того, что у нас все-таки автоматизированное построение запросов по схеме модели, не вижу ничего странного в том, что модель возвращает свой маппер.
$book = Book::dao()->getById(1);
Почему не умеет? Если AR не умеет - то и DM не умеет, я что-то не встречал нигде информации о том, что DM отличается от AR широтой find-ов. Плюс DM еще занимается и сохранением модели. А файндер есть везде, и его функционал нигде не оговаривается.На AR это совсем не похоже: AR так делать вообще не умеет. Но очень похоже на DM. Просто мысленно меняем Post::model() на new PostMapper.