检查是否存在别名?

Pat*_*ckB 8 doctrine query-builder symfony doctrine-orm symfony-2.3

我如何检查别名是否已定义?

没有办法检查这个.

这不起作用,因为我只有ROOT别名,没有连接别名.

/** @var $query \Doctrine\ORM\QueryBuilder */
$query->getRootAliases()
Run Code Online (Sandbox Code Playgroud)

这些部件对我来说是另一个无效的选择......

$query->getDQLPart()
Run Code Online (Sandbox Code Playgroud)

仅返回"select,from等"部分.

那就是我会"忽略"的错误.

[Semantical Error] line 0, col 254 near '_user LEFT': Error: '_user' is already defined.
Run Code Online (Sandbox Code Playgroud)

我怎么能检查别名是否存在?

Léo*_*ist 13

您可以使用PHP本机in_array函数来检查数组中是否存在该值.

in_array($alias, $qb->getAllAliases())
Run Code Online (Sandbox Code Playgroud)

  • `getAllAliases`可从Doctrine 2.5中获得,适用于遇到此问题的任何其他人 (3认同)

zuz*_*nen 8

您收到此错误是因为您尝试使用已定义的别名加入.

解决方案是检查连接DQL部分.在您的存储库方法中,您可以执行以下操作:

$joinDqlParts = $queryBuilder->getDQLParts()['join'];
$aliasAlreadyExists = false;

/* @var $join Query\Expr\Join */
foreach ($joinDqlParts as $joins) {
    foreach ($joins as $join) {
        if ($join->getAlias() === '_user') {
            $aliasAlreadyExists = true;
            break 2;
        }
    }
}

if ($aliasAlreadyExists === false) {
    $queryBuilder->innerJoin('parenttable._user', '_user')

}
Run Code Online (Sandbox Code Playgroud)

所以如果你没有加入,你只能加入.