我正在使用symfony2和doctrine2来开发一个Web应用程序。
我在应用中有一个表单,其中包含从实体填充的下拉列表。我已经配置了query_builder来过滤下拉字段中的值。
public function buildForm(FormBuilderInterface $builder, array $options) {
$centerId = $this->centerId;
$builder->add("glCode", "entity", array(
"class" => "MyBundle:GlCode",
"query_builder" => function(EntityRepository $er) use($centerId) {
return $er->createQueryBuilder("g")
->join("g.account", "a")
->where("g.id NOT IN (SELECT g2.id FROM MyBundle:OtherFixedCost c JOIN MyBundle:GlCode g2)")
}
));
此代码产生错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_WITH,得到')'
我正在尝试对查询构建器执行与以下 DQL 相同的操作:
SELECT g FROM MyBundle:GlCode g
JOIN g.account a
WHERE g.id NOT IN (
SELECT g2.id FROM MyBundle:OtherFixedCost c INNER JOIN MyBundle:GlCode g2
)
我不知道我是否遗漏了某些内容,但显然不存在直接在表单类中使用 DQL 的方法。所以,我被迫使用 QueryBuilder ,但我收到了上述错误。
答案 0 :(得分:0)
问题在于你的 where 子句,你应该使用函数 notIn(),而不是只在DQL上编写所有内容。看看documentation
也许this和this可以提供帮助,第二个实际上与您的查询非常相似,我引用了一些代码:
$qb->select('l')
->from('Entity\Location', 'l')
->where('l.state = :state')
->setParameter('state', 'UT')
->andWhere($qb->expr()->notIn('u.id',
$qb->select('l2.id')
->from('Entity\Location', 'l2')
->where(l2.location_type = ?1 AND l2.population < ?2)
->setParameters(array(1=> 1, 2 => 1000))
));
了解子查询是如何构建的。
答案 1 :(得分:0)
子查询应通过别名加入实体,而不是直接加入实体。即
(SELECT g2.id FROM MyBundle:OtherFixedCost c JOIN MyBundle:GlCode g2)
试
(SELECT g2.id FROM MyBundle:OtherFixedCost c JOIN c.GlCodes g2)
或其他任何OtherFixedCost和GlCode之间的关系名称。也许这会有所帮助,我一直写这样的子查询,没有任何问题。