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