2012-04-14 110 views
5

我有我的两个类UserRole,我需要编写一个QueryBuilder,它为具有ROLE_PROVIDER角色的用户返回一个查询。我需要这在Symfony的2实体表单字段在窗体类定义我对所提场下面的代码片段:Symfony 2中的Doctrine 2 - 通过关联过滤QueryBuilder

$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不支持通过关联本机过滤。在this page他们这样说,并建议使用DQL进行这种过滤。我的问题是,我还没有找到如何从DQL句子中创建一个QueryBuilder对象。如果您还可以为我提供正确的DQL查询,我将不胜感激...

感谢您的帮助!

回答

11

哪里应该真正做你想做的。你只要有语法错误的,“在”:

->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的工作。未经测试。

+0

谢谢!真正完整的答案......有一个问题,它与原始问题没有太大的关系,但是在这里我去了......我已经多次阅读过symfony 2和doctrine 2的新版本即将到来,而且人们似乎已经了解了新功能,但我已经厌倦了运行'php bin/vendors install',它不会升级symfony或教义......我该如何升级?或者什么时候这些新版本将成为官方?感谢您的回答!!! – Throoze 2012-04-14 23:39:43

+0

你可以在这里阅读关于D2.2的信息:http://www.doctrine-project.org/。在S2.1发布之前,S2将不会有D2.2集成,可能在今年夏天。但是,您可以直接安装D2.2,在autoload.php中调整路径,并且大部分您的教义代码应该可以工作。查看文档以了解要注意的事项。 – Cerad 2012-04-14 23:47:57

+0

感谢您的回答! – Throoze 2012-04-15 08:06:36

3

更简单还是可以这样做:

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

我觉得这远远超过加入更清晰的$ QB-> EXPR()...