【问题标题】:How to get doctrine2 table alias?如何获得学说2表别名?
【发布时间】:2012-06-06 08:52:14
【问题描述】:

我想在我的 Doctrine2 存储库类中创建一个方法,该方法接受一个 QueryBuilder 并添加一些额外的子句,其中一个是内连接。

如何找出用于实例化查询构建器的表别名?这是可以发现的还是应该是整个代码库的约定(因此是潜在的错误来源)?

我的客户代码是:

public function getPasswordAction($id)
{
    $user = $this->get('security.context')->getToken()->getUser();

    $repository = $this->getDoctrine()
        ->getRepository('TenKPwLockerBundle:Password');

    $query = $repository->createQueryBuilder('p')
        ->where('id = :id')
        ->setParameter('id', $id);

    $query = $repository->userCanReadRestriction($query, $user);
    ...

我的存储库类包含:

public function userCanReadRestriction(\Doctrine\ORM\QueryBuilder $builder, \TenK\UserBundle\Entity\User $user)
{
                             // where can I get 'p' from?
    return $builder->innerJoin('p.shares', 's')
        ->where('createdBy = :creator')
        ->orWhere('s.toUser = :toId')
        ->setParameters(array('creator' => $user, 'toUser' => $user));
}

实际上,在上面的代码中,我如何才能确认 QueryBuilder 是否与密码实体一起工作?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    QueryBuilder 对象有两个相关的方法: - getRootAliases() - getRootEntities()

    在具有from 子句集的 QueryBuilder 上调用 getRootAliases 将返回一个包含所有别名的数组;同样,调用 getRootEntities 将返回所选实体的缩短类名的数组。

    $qb = $em->createQueryBuilder();
    $qb->from('BundleName:EntityName', 'entityName');
    
    var_dump($qb->getRootAliases()); // returns ['entityName']
    

    【讨论】:

      【解决方案2】:

      我设法获得了别名

       $alias = current($builder->getDQLPart('from'))->getAlias();
      

      (其中 $builder 是 Doctrine\ORM\QueryBuilder 的一个实例)

      【讨论】:

        【解决方案3】:

        您可以通过调用 getDqlPart('select') 方法来检索 QueryBuilder 的 select 部分。

        更多信息here

        然后,看看教义如何解析选择部分here

        您可能也可以这样做以了解与您的存储库关联的表是否被调用以及它的别名是什么。

        【讨论】:

        • 嗯...看起来有点老套。还有另一种方法吗?人们如何在他们的代码中跟踪 QueryBuilder 对象?
        • 我已经把这个答案写下来了。我知道它很旧,但这并不重要。我为什么这样做:首先这是一个基于链接的答案,实际上是说“去某个地方自己解决问题”,其次,链接指向存储库的主分支,这意味着存储库的代码是否应该更改行指针将不正确(实际上已经发生了什么)
        猜你喜欢
        • 1970-01-01
        • 2016-01-26
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        相关资源
        最近更新 更多