Доктрина: leftJoin () не возвращает нуль в отношении ManyToMany - PullRequest
0 голосов
/ 19 октября 2019

У меня есть две сущности: Индикатор и Публикация в отношении ManyToMany.

/**
 * @ORM\Entity(repositoryClass="App\Repository\IndicatorRepository")
 */
class Indicator
{
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Publication", inversedBy="indicators")
     * @ORM\JoinTable(name="indicators_publications")
     */
    private $publications;

    ...
}
/**
 * @ORM\Entity(repositoryClass="App\Repository\PublicationRepository")
 */
class Publication
{
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Indicator", mappedBy="publications")
     */
    private $indicators;

    ...
}

Я пытаюсь написать функцию репозитория, которая возвращает массив всех Публикаций вбаза данных. Отдельная строка в этом массиве должна содержать следующую информацию: идентификатор и имя Publication плюс логическое поле, указывающее, относится ли Publication к определенному Indicator .

id    name     related
1     PubA     true
2     PubB     false
3     PubC     false
...
n     PubLast  true

В простом SQL это достигается с помощью следующего запроса:

SELECT p.`id`, p.`name`, IF(ip.indicator_id, TRUE, FALSE)
FROM publication p
LEFT JOIN indicators_publications ip
ON p.id=ip.publication_id AND ip.indicator_id=?;

Я изо всех сил пытаюсь создать эквивалентную функцию с помощью построителя запросов Doctrine. Я попытался использовать 'leftJoin ()', как в примере ниже (примечание: поскольку Doctrine не поддерживает синтаксис 'IF', я использую поле i.id, ожидая, что оно будет чем-то или 'null').

    public function findAllJoinIndicator(Indicator $indicator) {
        return $this->createQueryBuilder('p')
            ->select('p.id', 'p.name', 'i.id AS i_id')
            ->leftJoin('p.indicators', 'i', 'WITH', 'i = :indicator')
            ->setParameter('indicator', $indicator)
            ->getQuery()
            ->getArrayResult();
    }

Однако вышеприведенная функция возвращает только те публикации, которые относятся к данному индикатору (поскольку она компилируется в два оператора LEFT JOIN в SQL?) И пропускает те, которые не относятся к предоставленному индикатору.

Как переписатьфункция, чтобы она работала как SQL-запрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...