7

我想在我的 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 是否与密码实体一起工作?

4

3 回答 3

10

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

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

$qb = $em->createQueryBuilder();
$qb->from('BundleName:EntityName', 'entityName');

var_dump($qb->getRootAliases()); // returns ['entityName']
于 2014-09-26T21:37:21.380 回答
3

我设法得到别名

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

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

于 2013-05-07T14:55:58.097 回答
-1

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

更多信息在这里

然后,看一下这里的学说是如何解析选择部分

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

于 2012-06-06T10:18:35.687 回答