0

我正在使用 symfony2 和教义 2 来开发一个网络应用程序。

我在应用程序中有一个表单,它有一个从实体填充的下拉列表。我已经配置了一个 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)")
        }
    ));

此代码产生错误:Expected Doctrine\ORM\Query\Lexer::T_WITH, got ')'

我正在尝试对查询生成器执行与以下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,但我收到了上述错误。

4

2 回答 2

0

问题出在你的where子句中,你应该使用函数notIn()而不是只在 DQL 上编写所有内容。看看文档

也许可能会有所帮助,第二个实际上与您的查询非常相似,我从那里引用了一些代码:

$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))
));

看看子查询是如何构建的。

于 2013-05-01T16:39:10.343 回答
0

子查询应该通过别名加入实体,而不是直接加入实体。IE。

(SELECT g2.id FROM MyBundle:OtherFixedCost c JOIN MyBundle:GlCode g2)

尝试

(SELECT g2.id FROM MyBundle:OtherFixedCost c JOIN c.GlCodes g2)

或者 OtherFixedCost 和 GlCode 之间的关系名称是什么。也许这会有所帮助,我一直在写这样的子查询,没有问题。

于 2013-05-03T01:04:12.047 回答