Doctrine2 извлекает строки, которые имеют ассоциацию manyToMany с помощью QueryBuilder - PullRequest
3 голосов
/ 25 сентября 2011

все.У меня есть 2 объекта Город и POI.Сопоставление выглядит следующим образом:

class City {
/**
 * @ORM\ManyToMany(targetEntity="POI", mappedBy="cities")
 * @ORM\OrderBy({"position" = "ASC"})
 */
protected $pois;

и

class POI {
/**
 * @ORM\ManyToMany(targetEntity="City", inversedBy="pois")
 * @ORM\JoinTable(name="poi_cities")
 */
protected $cities;

Я хотел бы получить все POI, которые имеют хотя бы 1 связь с каким-либо городом, используя QueryBuilder.Я, вероятно, должен использовать функцию существующие (), но я не знаю, как.

Ответы [ 2 ]

6 голосов
/ 26 сентября 2011

Вы должны Left join их и проверить, является ли cities нулевым.

$qb->select('p', 'c')
   ->from('AcmeDemoBundle:POI', 'p')
   ->leftJoin('p.cities', 'c')
   ->where('c IS NOT NULL');

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

2 голосов
/ 04 мая 2015

Docrine2 был изменен в 2013 году, поэтому другое решение отображает ошибку Error: Cannot add having condition on a non result variable. Теперь мы не можем использовать объединенный псевдоним просто как условную переменную. Мы должны использовать любое из его свойств, таких как c.id

Так что вы должны исправить код на

$qb->select('p', 'c')
   ->from('AcmeDemoBundle:POI', 'p')
   ->leftJoin('p.cities', 'c')
   ->where('c.id IS NOT NULL');
$results = $qb->getQuery()->execute();

Если вы хотите выбрать объекты, которые не имеют городов, используйте IS NULL.

$qb->leftJoin('p.cities', 'city')
    ->where('city.id IS NULL')
    ->getQuery()
    ->execute();

Описание проблемы и ссылка на коммит, ответственный за это - http://www.doctrine -project.org / jira / browse / DDC-2780

...