可以在表单中使用查询构建器,按其他表/字段值过滤吗?

时间:2014-06-10 10:33:59

标签: symfony doctrine-orm

我们说我有两个实体:AB。这些实体具有单向关系。特别是外部密钥进入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类中?

希望很明显

2 个答案:

答案 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');
    });
}