5

我有两个类UserRole,我需要创建一个QueryBuilder返回具有该ROLE_PROVIDER角色的用户的查询。我需要在 Symfony 2 中的实体表单字段中使用它。在表单类定义中,我对提到的字段有以下片段:

$builder->add('provider', 'entity', array(
    'class'    => 'ElCuadreAccountBundle:User',
    'property' => 'username',
    'query_builder' => function(UserRepository $ur) {
                         return $ur->getUsersByRoleQB('ROLE_PROVIDER');
                       },
    'required' => true,
));

然后在我的自定义中,UserRepository我有以下函数,它应该返回一个QueryBuilder对象:

public function getUsersByRoleQB($role) {
    $qb = $this->createQueryBuilder('u');
    return $qb->join('u.roles','r')
              ->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))
              ->orderBy('u.username', 'ASC');
}

当然这不起作用,但我粘贴它以说明我的需求。

我一直在环顾四周,似乎 Doctrine2 不支持通过关联进行本地过滤。在此页面中,他们这样说,并建议使用DQL这种过滤。我的问题是我还没有找到如何从一个句子中制造一个QueryBuilder对象。DQL如果您也可以向我提供正确的DQL查询,我将非常感激...

谢谢你的帮助!

4

2 回答 2

11

实际上应该在哪里做你想做的事。你只是有'in'的语法错误:

->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))

应该

->where($qb->expr()->in('r.role',$role))

我知道这可能看起来有点奇怪,但由于准备好的语句不直接支持数组,所以 IN 子句的参数总是必须单独转义(哪个学说适合你)。因此,对于需要文字的 eq 表达式来说,语法有点不同。

您确实提出了一个很好的问题,因为我需要按关联进行过滤。我认为 D2.2 将允许这个开箱即用。我还没有真正尝试过,但我怀疑

$dql = 'a,b FROM whatever...'; // Don't start with SELECT
$qb->select($dql); 
return $qb;

只要您将实际的 'SELECT' 字符串从 $dql. 未经测试。

于 2012-04-14T17:15:29.650 回答
3

更简单的是你还可以这样做:

->where('r.role IN (:role)' )
->setParameter( 'role', $role );

我发现这比添加 $qb->expr()... 更清晰。

于 2012-12-11T19:46:44.280 回答