От SQL к DQL

Я хочу изменить этот SQL-запрос: (я использую пакет) (Evenement - это сущность, а evenement_evenement - результат самоотнесения многих ко многим из событий)

SELECT * 
FROM   evenement e 
       natural JOIN evenement_evenement ee 
WHERE  e.id = ee.evenement_source 
       AND e.id = 3 

В DQL. На данный момент у меня есть это:

public function findAllEventAssociateByEvent($idEvent){
    $qb = $this->createQueryBuilder('e');
    $qb->add('select', 'e');
    $qb->from('Bundle:Evenement', 'e2');
    $qb->where('e = :evenement');
    $qb->andWhere('e2 in e.evenements');
    $qb->setParameter('evenement', $idEvent);
    return $qb;
    //select * from evenement e NATURAL join evenement_evenement ee where e.id = ee.evenement_source and e.id = $idEvent
}

А у меня это:

$eventAssocies = $em->getRepository('Bundle:Evenement')->findAllEventAssociateByEvent($id)->getQuery()->getResult();

Но не работает, у меня ошибка в "andWhere", но я не знаю почему ...

Возможный дубликат SQL выполняет преобразование DQL

Preciel 26.03.2018 14:39

Что означает «У меня ошибка»? Есть ли какое-нибудь сообщение об ошибке, которым вы забыли поделиться?

Nico Haase 26.03.2018 14:40

Да, я провел небольшое исследование, не помогло. И моя ошибка для этого кода: [Синтаксическая ошибка] строка 0, столбец 104: Ошибка: ожидаемая Doctrine \ ORM \ Query \ Lexer :: T_OPEN_PARENTHESIS, получено 'e'

Morgan Tartreau 26.03.2018 14:58

не могли бы вы опубликовать свой класс сущности evenement?

Scaramouche 26.03.2018 18:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
69
2

Ответы 2

Я думаю, что вы неправильно поняли некоторые вещи, я думаю, ваш запрос должен больше выглядеть так:

public function findAllEventAssociateByEvent($idEvent){
    $qb = $this->createQueryBuilder('e')
       ->join('e.evenement_evenement', 'e2')
       ->where('e = :evenement')
       ->setParameter('evenement', $idEvent);
    return $qb;
}

Присоединение сделает то, что вы пытались сделать со своим AndWhere, я полагаю

У меня есть этот запрос с вашим кодом «SELECT e FROM Bundle \ Entity \ Evenement e INNER JOIN e.evenement e2 WHERE e =: evenement», мне нужны оба условия: / И эта ошибка: [Семантическая ошибка] строка 0, столбец 69 рядом 'e2 WHERE e =': Ошибка: пакет класса \ Entity \ Evenement не имеет ассоциации с именем evenement

Morgan Tartreau 26.03.2018 14:51

Я предположил, что у вас есть связанный объект, отображаемый полем с именем evenement, но вам нужно адаптироваться к вашей ситуации.

Gregoire Ducharme 26.03.2018 14:59

Использование join в соответствующем поле выполнит ваше второе условие ->join('e.relatingField, 'e2', 'WITH', 'e2.relatingField = id'), что в значительной степени то, что оно означает

Gregoire Ducharme 26.03.2018 15:00

Вы не можете использовать andWhere таким образом, вы должны относиться к нему так же, как вы относились к своему пункту where. Объявите параметр, а затем установите его. Насколько я понимаю, вам нужно использовать подзапрос для этой части e.evenements. Что бы вы ни ожидали в части e.evenements, извлеките ее в переменную, например, $evenements, и выполните следующие действия:

$qb->andWhere('e2 IN (:evenements)')
   ->setParameter('evenements', $evenements, Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

Предполагая, что $evenements - это массив. Если это строка, вы можете, например, explode().

Если вы ищете быстрое решение, попробуйте следующее:

$qb = $this->createQueryBuilder('e')
           ->select('e.id')
           ->where('e.id = :evenement')
           ->setParameter('evenement', $idEvent);
 $evenementsIds = $qb->getQuery()->getResult(); // This will get you an array of ID's

$qb2 = $this->createQueryBuilder('e2')
            ->where('e2.id IN (:evenements)')
            ->setParameter('evenements', $evenementsIds, Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

$result = $qb2->getQuery()->getResult();

Что такое результат (что вы получаете) и что такое хороший результат (что вам нужно получить)? Пожалуйста, дважды проверьте, что у вас что-то есть в вашей базе данных. Попробуйте заново создать запрос с помощью клиента MySQL, чтобы увидеть, действительно ли вы запрашиваете с хорошими параметрами.

Domagoj 26.03.2018 15:13

Я получаю 1 результат, но мне нужно 2 результата (мне нужно результаты в моей базе данных). Я получаю 2 результата в phpmyadmin с этим: select * from evenement e NATURAL join evenement_evenement ee, где e.id = ee.evenement_source и e.id = 1, где 1 - это идентификатор 1 события

Morgan Tartreau 26.03.2018 15:17

В этом случае дважды проверьте свои параметры и записи в базе данных. Я старался изо всех сил с синтаксисом DQL, и, поскольку вы получили «кое-что», я думаю, что на ваш вопрос, связанный с ошибкой, есть ответ. Теперь, что происходит с вашими параметрами и результатами, я не могу вам ничего рассказать без более подробной информации.

Domagoj 26.03.2018 15:23

В моей базе данных: evenement: id, date ... (с моей сущностью Evenement) evenement_evenement = evenement_origin, evenement_target (сгенерировано из entity Evenement с manytomany)

Morgan Tartreau 26.03.2018 15:37

evenement и evenement_evenement - две таблицы в моей базе данных

Morgan Tartreau 26.03.2018 15:43

Другие вопросы по теме