Я пытаюсь получить коллекцию сущностей (которая называется Animation) по его связи ManyToMany с другой сущностью (которая называется Tag).
Вот моя анимация:
class Animation
{
/**
* @ORM\ManyToMany(targetEntity="Company\AppBundle\Entity\Tag",inversedBy="animations")
*/
protected $tags;
}
И мой тег Entity:
class Tag
{
/**
* @ORM\ManyToMany(targetEntity="Company\AppBundle\Entity\Animation", mappedBy="tags")
* @ORM\JoinTable(name="animation_tag")
*/
protected $animations;
}
Я просто хочу получить анимации, которые имеют менее 3 тегов, даже если ни один тег не связан с ними.
Я создал метод findAnimsByTag () в моем AnimationRepository при использовании Doctrine Query Builder, как показано ниже:
public function findAnimsByTag() {
return $this->getEntityManager()->createQueryBuilder()
->select('a')
->from('CompanyAppBundle:Animation', 'a')
->join('a.tags', 't')
->groupBy('t')
->having('COUNT(t) < 3 ')
->getQuery()
->getResult();
}
Этот запрос хорошо выбирает сущности, которые имеют не более 3 тегов, но не получают сущности, которые еще не имеют отношения (как объяснено в верхней части поста).
Кто-нибудь, чтобы помочь мне?
(Я буду редактировать пост, если кому-то понадобится более подробная информация.)
Используйте leftJoin вместо join
public function findAnimsByTag() {
return $this->getEntityManager()->createQueryBuilder()
->select('a')
->from('CompanyAppBundle:Animation', 'a')
->leftJoin('a.tags', 't')
->groupBy('t')
->having('COUNT(t) < 3 ')
->getQuery()
->getResult();
}
Других решений пока нет …