#php #mysql #orm #named-scope #doctrine-orm
#php #mysql #orm #named-scope #doctrine-orm
Вопрос:
Имеет ли Doctrine2 функции, аналогичные именованным областям ActiveRecord?
Комментарии:
1. Они также есть в Yii framework yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes
Ответ №1:
В D2 его нет, но, вероятно, не составит большого труда реализовать систему, подобную Yii, с использованием класса QueryBuilder Doctrine 2, который позволяет создавать запрос по частям, используя более программный подход.
$qb = $em->createQueryBuilder;
$qb->select('u')
->from('User', 'u')
->where('active IS NOT NULL);
Похоже, что реализация Yii хранит критерии запроса в массиве, и они вводятся в запрос при использовании именованной области. Вы могли бы легко сделать что-то подобное, что возвращает объект QueryBuilder с предварительно загруженными параметрами.
class UserRepository extends EntityRepository
{
private $_namedScopes;
public getActiveUsersWhoLoggedInLastWeek()
{
// return a query builder for this model
$qb = $this->_namedScopes->initScope();
// start adding pre-defined criteria
$qb = $this->_namedScopes->addScope($qb, 'active')
$qb = $this->_namedScopes->addScope($qb, 'lastWeek');
return $qb->getQuery()->getResult();
}
}
Вероятно, есть несколько разных способов подойти к этому, так что это всего лишь один краткий пример. Вероятно, самой сложной частью будет выяснить, как обрабатывать конфликты критериев.