Symfony2 заполняет sql-запрос

#symfony #doctrine-orm

#symfony #doctrine-orm

Вопрос:

У меня есть два объекта: сотрудник и реализация

В реализации объекта у нас есть атрибут employe и тип. Теперь я хочу выбрать некоторых сотрудников, которые сделали некоторые реализации.

 $sql = "SELECT DISTINCT e FROM MonBundle:Employe e WHERE e IN ( SELECT DISTINCT r.employe FROM MonBundle:Realisation r WHERE
r.type = :type)";
$query = $em->createQuery($sql);
$query->setParameter("type",$type);
  

==> Ошибка: неверное выражение пути. Должно быть выражение statefieldpath

Комментарии:

1. почему не просто SELECT DISTINCT r.employe FROM MonBundle:Realisation r WHERE r.type = :type ?

2. Недопустимое выражение пути. Должно быть выражение statefieldpath.

Ответ №1:

Привет, связь между вашим сотрудником и реализацией должна быть двунаправленной «один к одному» или двунаправленной «один ко многим»

вы можете увидеть, как это работает здесь http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-one-bidirectional

благодаря этому вы можете получить доступ ко всем связанным данным вашего объекта

Затем вы можете использовать СОЕДИНЕНИЕ в своем запросе, чтобы связать вашего сотрудника с одной или несколькими реализациями (зависит от типа отношения между вашими 2 объектами) и сделать что-то вроде

 SELECT DISTINCT e
FROM MonBundle:Employe e
JOIN e.realisation r
WHERE r.type = :type
  

чтобы получить список сотрудников, у которых есть реализация с типом = ?

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#joins

Комментарии:

1. в объекте employee нет поля с именем realisation

2. @krome Добро пожаловать в stack overflow; пожалуйста, имейте в виду, что это может помочь дать объяснение в вашем ответе о том, что JOIN и как это работает, поскольку это может помочь задавшему вопрос более эффективно применять его, а также поможет будущим посетителям веб-сайта, которые могут не понимать, что это JOIN делает изтолько код в вашем ответе.

3. Большое вам спасибо