我们说我有两个实体:A
和B
。这些实体具有单向关系。特别是外部密钥进入B
实体,并且根据关系的基数,A
没有任何"直接"检索B
个对象的属性(属性)。
好的,现在让我们说我想为一些B
对象构建一个表单。
在我的FormType中,我会做类似的事情:
public function BuildForm(FormBuilderInterface $builder)
{
[...]
$builder->add('A',entity,array('class'=>'MyFooBundle:A'));
[...]
}
好的,现在让我们说我想应用一个"过滤器"在A
下拉列表中,此过滤条件特别明确:我不想显示与A
已有关系的任何B
实体。
对我来说这是非常棘手的,因为我知道我可以使用闭包和query_builder
选项,但问题是query_builder
,据我所知,使用字段的类来做查询。我尝试过的是
$sub_query = $repo->createQueryBuilder('B');
$sub_query = $sub_query->select('B.A')
->from('MyFooBundle:B','b');
$qb = $repo->createQueryBuilder('A');
return $qb->where($qb->expr()->notIn('A.id', $sub_query->getDQL()));
当然B.A
返回A.id
的对照(B中包含的外键)
但是$sub_query
仍尝试将A
用于该选择(因为应用query_builder
的属性类为A
)
所以,提出真正的问题,是否有一种等效的方法来做我需要的事情,或者简单地说"我是否要将此关系设为双向并使用直接属性包含在A
类中?
希望很明显
答案 0 :(得分:1)
根据OneToOne关系类型和A端可以为空,您可以将DQL设为:
$qb = $repo->createQueryBuilder('A')
->leftJoin('YourBundle:BEntity', 'B', 'WITH', 'A.id = B.A_id')
->where('B.id IS NULL')
->getQuery();
$result = $qb->getResult();
创建的DQL表示选择所有A记录与B连接,其中B.id在A
中不存在答案 1 :(得分:-1)
这是我的例子,希望这会有所帮助。
$builder->add("parent", 'entity', $this->getParentUserEntityOptions());
private function getParentUserEntityOptions() {
return array('empty_value' => 'Select',
'class' => 'TMSolution\UserBundle\Entity\User',
'property' => 'username',
'query_builder' => function(\Doctrine\ORM\EntityRepository $er ) {
return $er->createQueryBuilder('u')
->orderBy('u.id', 'ASC')
->where('u.locked = 0');
});
}