Доктрина: Как сделать заказ по признаку от ассоциации с Критериями - PullRequest
0 голосов
/ 27 мая 2018

Я не могу упорядочить записи по атрибуту из другой сущности.

У меня есть класс Employee, у которого есть атрибут $ user, который указывает на класс User, у которого есть атрибут $ active.

Теперь я хочу отсортировать Employee по user.active , и я не могу этого сделать.Вот как я называю их:

/**
* @param Criteria $criteria
* @param array $order_by
* @param integer $limit
* @param integer $offset
* @return \Doctrine\Common\Collections\Collection
*/
public function findByCriteria($criteria, $order_by = null, $limit = null, $offset = null) {
  $criteria->setFirstResult($offset);
  $criteria->setMaxResults($limit);
  $criteria->orderBy($order_by);

  $result = $this->repository->matching($criteria);

  return $result;
}

Я проверил BaseEntityPersister.php, и похоже, что нет реализации такой вещи.Он просто проверяет, является ли user.active атрибутом класса Employee, и выдает

Doctrine\ORM\ORMException

Unrecognized field: user.active

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

Спасибо за советы!

РЕДАКТИРОВАТЬ:

Если я использую findBy , проблем с полем сортировки user нет.active .Должен ли я считать это ограничением соответствия метода?Это печально, потому что мне нужно использовать Doctrine \ Common \ Collections \ Criteria.Я могу использовать findBy с порядком, а затем использовать соответствующий метод для фильтрации записей, но я бы предпочел сделать это на стороне базы данных.

РЕДАКТИРОВАТЬ 2:

Я использую Nette с Kdyby / Doctrine.Не знал, что user.active реализован в Kdyby / doctrine, а не в Doctrine напрямую.Поэтому я полагаю, что на этот вопрос не будет ответа ..

1 Ответ

0 голосов
/ 11 февраля 2019

Если вы посмотрите на Kdyby / Doctrine, он расширяет возможности findBy, автоматически обнаруживая связи и выполняя соединение, если необходимо, как показано здесь , вызывая autoJoinOrderBy .Это причина, по которой критерии не поддерживают join, а Kdyby - findBy.

Если вы хотите многократно использовать способ создания запросов Doctrine, Criteria вам в этом не поможет, но есть QueryObject, который выполняет аналогичную работу и позволяет повторно использовать части логического запроса, но с использованием QueryBuilder.Это не так хорошо документировано, но вот некоторые ресурсы:

Официальная документация QueryObject

Запись блога с примером использования

Презентация автора Kdyby / Doctrine о Doctrine и QueryObject (из слайда 43)

Еще немного официальной информации о QueryObjects

...