我似乎无法解决这个问题,尽管这应该是相当简单的事情。
我有Image实体和Article实体。许多文章都可以使用相同的图像,但每篇文章只能有一个图像,因此它们被映射为OneToMany< - > ManyToOne。
现在,我需要选择仅图像,这些图像没有与之关联的任何文章。我该怎么做?
我试过了:
$repository->createQueryBuilder('i')
->select('i')
->where('count(i.articles) = NULL');
但它不起作用。我怎样才能做到这一点?
我在Type类中使用它并尝试使用仅未使用的实体创建实体字段,如果它是相关的,这里是完整的功能代码:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('images', 'entity', array(
'class' => 'BloggerBlogBundle:Image',
'query_builder' =>
function(EntityRepository $er)
{
return $er->createQueryBuilder('i')->.........here goes query creation
},
)
)
;
}
如果需要,这也是关联:
图片类:
/**
* @ORM\OneToMany(targetEntity="Blog", mappedBy="image")
*/
protected $articles;
博客课程:
/**
* @ORM\ManyToOne(targetEntity="Image", inversedBy="articles")
*/
protected $image;
答案 0 :(得分:4)
试试这个:
$qb->createQueryBuilder();
->select('i');
->from('BloggerBlogBundle:Image', 'i')
->leftJoin('i.articles', 'a')
->where('a is NULL');
答案 1 :(得分:1)
您不应该在那里使用count()
功能,并且... = NULL
需要更改为... is NULL
才能使Doctrine完成其工作。
总数:
$repository->createQueryBuilder('i')
->select('i')
->where('i.articles is NULL');
答案 2 :(得分:0)
接受的答案不再有效 - 您必须将.id
添加到where表达式:
$qb->createQueryBuilder();
->select('i');
->from('BloggerBlogBundle:Image', 'i')
->leftJoin('i.articles', 'a')
->where('a.id is NULL');