Php Symfony 2中的原则2-通过关联过滤QueryBuilder

Php Symfony 2中的原则2-通过关联过滤QueryBuilder,php,symfony,doctrine-orm,dql,query-builder,Php,Symfony,Doctrine Orm,Dql,Query Builder,我有两个类User和Role,我需要创建一个QueryBuilder,它为拥有Role\u PROVIDER角色的用户返回一个查询。我需要在Symfony 2中的实体表单字段中使用此字段。在Form类定义中,我为提到的字段提供了以下代码段: $builder->add('provider', 'entity', array( 'class' => 'ElCuadreAccountBundle:User', 'property' => 'username',

我有两个类
User
Role
,我需要创建一个
QueryBuilder
,它为拥有
Role\u PROVIDER
角色的用户返回一个查询。我需要在Symfony 2中的实体表单字段中使用此字段。在Form类定义中,我为提到的字段提供了以下代码段:

$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
进行这种过滤。我的问题是,我没有找到如何从
DQL
语句生成
QueryBuilder
对象。如果您也能为我提供正确的
DQL
查询,我将非常感激


谢谢你的帮助

你应该在哪里真正做你想做的事。只是“in”的语法有误:

这个

应该是

->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之外,就可以在不指定任何其他部分的情况下实际工作。未经测试。

更简单的是,您可以执行以下操作:

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

我发现这比添加$qb->expr()更易读……

谢谢!真正完整的答案。。。有一个问题,它和原来的问题不太相关,但我现在开始。。。我已经读过好几次了,symfony 2和doctrine 2的新版本即将推出,人们似乎对新功能有所了解,但我厌倦了运行
php bin/vendors install
,它既不升级symfony也不升级doctrine。。。如何升级?或者这些新版本什么时候会成为官方版本???谢谢你的回答!!!您可以在此处阅读有关D2.2的内容:。S2在S2.1发布之前(可能是今年夏天)不会集成D2.2。但是,您可以直接安装D2.2,在autoload.php中调整路径,并且在大多数情况下,您的条令代码应该可以工作。检查文档中需要注意的事项。
->where('r.role IN (:role)' )
->setParameter( 'role', $role );