【发布时间】:2014-11-19 07:14:21
【问题描述】:
我正在使用 symfony 2 和教义在查询构建器的帮助下预过滤表单字段类型“实体”。
我的查询构建器应该返回用户尚未添加到列表中的所有产品。 所有的关系都是双向的。 我有链接到 userIngredients (oneToMany) 的产品,每个链接到一个用户 (manyToOne)
到目前为止,我已经有了这个,但它不起作用,我得到了其他用户没有添加的产品。
return $this
->createQueryBuilder('p')
->leftJoin('p.userIngredients', 'i')
->where('i.user <> ?1')
->setParameter(1,$user);
1;有关如何纠正此问题的任何线索?
或者,我可以选择我不想要的产品,然后重新选择那些不匹配但使用表达式的产品,而 NotIn 似乎只适用于字符串
$products = $this
->createQueryBuilder('p')
->leftJoin('p.userIngredients', 'i')
->where('i.user = ?1')
->setParameter(1,$user)
->getQuery()
->getResult();
return $this
->createQueryBuilder('p')
->where($this->createQueryBuilder('p')->expr()->notIn('p', $products));
2;我们如何纠正它以使其与对象一起使用?
3;或者:有没有办法将结果数组而不是查询构建器传递给 symfony 表单构建器?
【问题讨论】:
-
您最初的想法对我来说似乎完全合法,尽管我从未使用过
<>运算符,而是!=。您是否尝试过在分析器中验证DQL? -
这实际上是正常的,它不起作用:在检索产品 1 的用户成分时,我可能有另一个用户的用户成分。因此它不满足 where 子句。我需要一个条件来说明 $user 不属于每个 userIngredient->getUser... 组成的数组
-
我认为第二个应该可以,但是您需要传递第一个 DQL 而不是整个结果对象。我的意思是
$dql = $this->createQueryBuilder('p')->leftJoin('p.userIngredients', 'i')...->getQuery();然后是return $this->createQueryBuilder('p')...->expr()->notIn('p', $dql))->getQuery()->getResult(); -
哇,我终于明白了,你为我指明了正确的方向!非常感谢。我将解决方案作为新答案发布。
标签: symfony doctrine-orm one-to-many where-clause query-builder