Thr*_*oze 5 php dql query-builder symfony doctrine-orm
我有我的两个类User和Role,我需要做出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,
));
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义中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');
}
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,但我粘贴它来说明我的需求.
我一直在环顾四周,似乎Doctrine2不支持通过关联进行原生过滤.在这个页面中他们这么说,并建议使用DQL这种过滤.我的问题是我还没有找到如何QueryBuilder从一个DQL句子中创建一个对象.如果你也能提供正确的DQL查询,我将非常感激......
谢谢你的帮助!
Cer*_*rad 11
哪里应该实际做你想要的.您只需要'in'的语法错误:
这个
->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))
Run Code Online (Sandbox Code Playgroud)
应该
->where($qb->expr()->in('r.role',$role))
Run Code Online (Sandbox Code Playgroud)
我知道它看起来有点奇怪但是由于预处理语句不直接支持数组,因此IN子句的参数总是必须单独转义(这个学说适合你).因此,对于需要文字的eq表达式,语法有点不同.
你提出了一个很好的问题,因为我需要按关联过滤.我认为D2.2将允许开箱即用.我没有真正尝试过,但我怀疑
$dql = 'a,b FROM whatever...'; // Don't start with SELECT
$qb->select($dql);
return $qb;
Run Code Online (Sandbox Code Playgroud)
只要您将实际的'SELECT'字符串保留在$ dql之外,它实际上可以在不指定任何其他部分的情况下工作.未经测试.