YiiFramework Опасность в архитектуре yii Active Record

Redjik

Джедай-мастер
Ragazzo учитывая, как они хотят сделать $model->asArray()->findAll() - однозначно "не так".
Получается, что у одного метода объекта разные типы результата в зависимости от контекста вызова, нестабильный API, нарушение идей банды 4х.

Любой, кто писал на java, скажет, что лучше $model->findAll()->asArray() - пусть findAll() вернет коллекцию.
Впрочем, я это сам скоро сделаю в 1й версии. Пока выйдет 2ка - рак на горе свиснет.
Надо еще подумать, как с plain sql коллекцию получать, не обязательно сразу реализовывать.
PHP:
Post::model()->fromSql($sql)->findAll()->asArray();
Объясню зачем может понадобиться - фасетные классификаторы и фильтры товаров.
В запросе должны будут быть вагон и телега кастомных плейсхолдеров. С AR синтаксисом будет взрыв мозга, даже с использованием builder.
 

Ragazzo

TDD interested
fixxxer
ну, посмотрим что выйдет) может будет отдельно хорошо развиваться как разные форки там ОС так же живут хорошо и т п)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
что такое фасетные классификаторы? сделать это несложно, вопрос: зачем тут Post::model(), если fromSql($sql) ?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>нужно, чтобы на выходе был ar и lazy loading

не может у SQL на выходе быть AR :)
Основная идея AR в том, что каждый объект - это маппинг на запись в таблице, а изменения в объекте можно сохранить в базе.
Как ты себе это представляешь: и мапинг классов на таблицы сохранить, и свободный SQL добавить? Как сохранять изменения в объектах, которые получены в результате кастомного запроса?
 

fixxxer

К.О.
Партнер клуба
Это, между прочим, очень хороший вопрос. (Я, конечно, не про конкретно AR, в его рамках - уж точно никак).

Вот потому у меня пока и нет никаких ORM-ов (если не считать ORM-ом $Query->...->execute()->sendTo($this)), потому что я не придумал, как решить эту задачу нормально. :)

Хотя идеи были, но получается так громоздко, что проще SQL написать.

Ну, то есть, громоздкой получается конфигурация, в принципе, в доктрине-то с этим не лучше, а люди пользуются. Надо еще подумать. =)
 

fixxxer

К.О.
Партнер клуба
grigori
Не, ну предполагаются такие запросы, которые замапить таки можно, иначе нет никакого смысла.
Другое дело, что маппинг может быть не совсем банальный.
 

Ragazzo

TDD interested
grigori
не, ну если конечно у вас там такие запросы каждый раз прям, то понятно не поможет ага. Вообще в AR как ты знаешь populateRecord/populateRecords т.е. тупо тот же маппинг только сбоку, тут "всего лишь" надо будет указать на какой класс маппить и все.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Я наткнулся на вот какую штуку.
У моих ребят при выводе каталога большая часть запросов общая, и они вынесли большой кусок кода по генерации запроса в отдельный метод.
На Yii это не так страшно: они работают с объектом CDBCriteria с общими JOIN-ами и условиями, потом в него можно добавить еще условия.
Пока CDBCriteria генерит SQL на основе классов мапинга - все нормально, но если смешать plain SQL и параметры мапинга - кое-где начнет генериться невалидный запрос.
 

fixxxer

К.О.
Партнер клуба
Вот и я не вижу иного выхода, кроме как делать абстрактный QueryBuilder и Sql\Dialect\Mysql, Sql\Dialect\Postgresql и т.д. С полным покрытием, да. Жесть ;)
 

Фанат

oncle terrible
Команда форума
Вот и я не вижу иного выхода, кроме как делать абстрактный QueryBuilder и Sql\Dialect\Mysql, Sql\Dialect\Postgresql и т.д. С полным покрытием, да. Жесть ;)
Это я называю "Написать SQL на PHP"

Кстати, Григорий тут на днях шикарно скаламбурил, в чате по сходному вопросу - когда запрос не укладывался в прокрустово ложе AR:
[11:39:27] Максим: Не судьба. для фанатов plain sql запросов одно разочарование
[11:40:10] Grigori: я же только что написал: Фанат plain SQL от разочарования написал либу с типизированными плейсхолдерами
:)))
 

MiksIr

miksir@home:~$
/**
* Initializes this model.
* This method is invoked when an AR instance is newly created and has
* its {@link scenario} set.

* You may override this method to provide code that is needed to initialize the model (e.g. setting
* initial property values.)
*/
public function init()
{
}
Т.е. init для создания объектов с данными, а Model::model() - это синглтон дающий объект модели для доступа к сервисным методам.
 

MiksIr

miksir@home:~$
Очевидность - это интуитивное решение проблемы на основе приобретенного опыта. Детям, например, не очевидно, что засунув палец в розетку можно получить проблемы.
Я не знаю откуда тут мысли, что Yii "очевидный" фреймворк. Там куча нелогичностей, куча совершенно непрозрачной логики. Ну ее нужно внимательно изучать, по исходникам, конечно.
 

fixxxer

К.О.
Партнер клуба
Мыши плакали, кололись, но продолжали жрать кактус. :D

Не, ну я правда не понимаю чего там 2 дня, я обычно вар-дампами и дебаг-бектрейсами такие места в не менее неочевидных вещах нахожу максимум за час.
А тут еще и phpdoc есть.
 
Сверху