Использование виртуальных полей в Doctrine_Query - PullRequest
3 голосов
/ 22 мая 2010

Есть ли способ вставить логику, основанную на виртуальных полях, в Doctrine_Query?

Я определил виртуальное поле в моей модели, getStatus (), которое я в конечном итоге хотел бы использовать в предложении Whereв моем Doctrine_Query.

...
->AndWhere('x.status = ?',$status);

"status", однако, не является столбцом в таблице, а вместо этого вычисляется бизнес-логикой в ​​модели.

Фильтрация коллекции после выполнения запроса в некоторых ситуациях работает, но не тогда, когда Doctrine_Pager добавляется в микс, так как он вычисляет его смещения и тому подобное, прежде чем вы получите доступ к Коллекции.

Лучше ли я отключить Doctrine_Pager и восстановить эту функциональность после изменения Doctrine_Collection?

Ответы [ 2 ]

0 голосов
/ 27 мая 2010

Я на самом деле не знаю, какую бизнес-логику вы применяете для определения статуса, но если она не активна (например, вычисляется по запросу), я бы вычислял ее при сохранении (используя прослушиватель записей Doctrine или просто зацепите preSave / preInsert в модели) и сохраните его в таблице, либо настройте задачу symfony, чтобы периодически обновлять ее и запускать как cronjob. Это позволило бы вам выполнять запросы в Doctrine и повысить производительность в качестве дополнительного преимущества.

В качестве альтернативы, если состояние зависит от состояния связанных объектов, вы можете добавить к ним триггер события, который обновляет состояние родительского объекта при их изменении. Трудно рекомендовать лучший подход без большего контекста. :)

0 голосов
/ 24 мая 2010

Если вы можете сделать это в SQL, вы можете сделать это в Doctrine. Все, что делает доктрина - это работает над тем, что вы помещаете в анализатор DQL, будь то строки или значения, и превращаете это в SQL, а затем гидратируете объекты из результата.

Вы не можете использовать Doctrine_Pager для пейджинга на объектах, не являющихся запросами, однако вы можете использовать sfPager и передавать ему результаты Doctrine_Collection в виде массива? В худшем случае вы могли бы передать ему результаты запроса за вычетом любых ограничений в запросе и позволить ему обрабатывать разбиение на страницы, однако это действительно неэффективно.

Возможно, быстрее будет написать пейджер "старый skool", как в обычном старом PHP.

...