createQueryBuilder условие oneToMany

0

Я использую Symfony 3.4. У меня проблема с запросом:

$qb = $this->createQueryBuilder('o')
    ->leftJoin('o.prices', 'p', 'WITH', 'p.dateEnd >= :now OR p.dateEnd IS NULL')
    ->setParameter('now', $nowDate);

return $qb->getQuery()->getResult();

Итак, у меня есть сущность Offer o OneToMany Price p.

Мне нужно с этим запросом получить предложения и цену, только если условие действительно: p.dateEnd >= :now OR p.dateEnd IS NULL

У меня в моей базе данных 2 цены с dateEnd = null и dateEnd = 2018-01-01 00:00:00, поэтому я ожидаю получить только цену с dateEnd = null, но у меня есть все цены в моем getResult()...

Зачем?

Как я могу получить только определенную цену, а не все цены за каждое предложение?

Спасибо!

Изменение: Это мой sql:

SELECT o0_.id AS id_0
FROM offer o0_
  LEFT JOIN price p1_
    ON o0_.id = p1_.offerId
      AND (p1_.date_end >= ? OR p1_.date_end IS NULL)

Изображение 174551

  • 0
    Распечатать dql создан, это может быть помощь
  • 0
    Я обновил свой вопрос
Показать ещё 7 комментариев
Теги:

2 ответа

1
Лучший ответ

Ответ на этот вопрос - добавить ->select('o', 'p') к запросу.. Не знаю, почему!

  • 0
    leftJoin выполняет соединение, этого может быть достаточно для фильтрации некоторых данных. Но если вы также хотите получить их после гидратации, вы должны сообщить об этом доктрине. Вы можете добавить ->addSelect('p') , этого достаточно (корневой объект выбран по умолчанию).
0

Поскольку это левое соединение, я думаю, вы могли бы написать свой запрос следующим образом:

$qb = $this->createQueryBuilder('o')
        ->leftJoin('o.prices', 'p')
        ->where('p.dateEnd >= :now OR p.dateEnd IS NULL')
        ->setParameter('now', $nowDate);

    return $qb->getQuery()->getResult();
  • 0
    Это то же самое ;)
  • 1
    @ ClémentAndraud ты имеешь в виду, что это не работает?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню