【问题标题】:Doctrine 2 in Symfony 2 - Filtering a QueryBuilder by an associationSymfony 2 中的 Doctrine 2 - 通过关联过滤 QueryBuilder
【发布时间】:2012-04-14 00:25:41
【问题描述】:

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

$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 查询,我将非常感激...

感谢您的帮助!

【问题讨论】:

    标签: php symfony doctrine-orm dql query-builder


    【解决方案1】:

    实际上应该在哪里做你想做的事。你只是'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 中保留下来,实际上就可以在不指定任何其他部分的情况下工作。未经测试。

    【讨论】:

    • 谢谢!真的很完整的答案... 一个问题,和原来的问题关系不大,但是我来了... 看了好几遍symfony 2 和学说2 的新版本来了,人们似乎对新功能,但我厌倦了运行php bin/vendors install,它既不升级 symfony 也不升级教义......我该如何升级?或者这些新版本什么时候会正式发布???谢谢你的回答!!!
    • 您可以在此处阅读有关 D2.2 的信息:doctrine-project.org。在 S2.1 发布之前,S2 不会集成 D2.2,可能在今年夏天。但是,您可以直接安装 D2.2,在 autoload.php 中调整路径,并且在大多数情况下,您的学说代码应该可以工作。查看文档以了解需要注意的事项。
    【解决方案2】:

    你可以做的更简单:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 2014-09-30
      • 1970-01-01
      • 2012-01-10
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多