Symfony 如何获取doctrine2表别名?

Symfony 如何获取doctrine2表别名?,symfony,doctrine-orm,Symfony,Doctrine Orm,我想在我的a Doctrine2存储库类中创建一个方法,该方法采用QueryBuilder并添加一些额外的子句,其中一个是内部联接 如何找到用于实例化querybuilder的表别名?这是可以发现的还是应该是整个代码库的约定(因此可能是bug的来源) 我的客户代码是: public function getPasswordAction($id) { $user = $this->get('security.context')->getToken()->getUser()

我想在我的a Doctrine2存储库类中创建一个方法,该方法采用QueryBuilder并添加一些额外的子句,其中一个是内部联接

如何找到用于实例化querybuilder的表别名?这是可以发现的还是应该是整个代码库的约定(因此可能是bug的来源)

我的客户代码是:

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是否正在使用密码实体?

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

更多信息

然后,看看条令如何解析select部分


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

我设法用

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

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

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

在设置了
from
子句的QueryBuilder上调用GetRootAlias将返回所有别名的数组;类似地,调用getRootEntities将返回所选实体的缩短类名数组

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

var_dump($qb->getRootAliases()); // returns ['entityName']

隐马尔可夫模型。。。看起来有点老套。还有别的办法吗?人们如何在代码中跟踪QueryBuilder对象?我已经记下了这个答案。我知道它很旧,但那没关系。我这样做的原因:首先,这是一个基于链接的答案,实际上是说“自己去某个地方想办法解决问题”,其次,链接指向存储库的主分支,这意味着如果存储库的代码发生更改,行指针将不正确(实际上已经发生了什么)