У меня есть две сущности: Индикатор и Публикация в отношении 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-запрос?