我正在使用Yii1和doctrine2中的过滤器开发一个列表。 我将跳过不必要的信息,如控制器动作代码,并解释问题。
这是我的queryBuilder对象:
$queryBuilder = $this->createQueryBuilder('asset')
->select("asset.id,
CONCAT(user.firstName, CONCAT(' ',user.lastName)) assignedBy,
asset.createdAt, asset.serial, asset.brand, asset.model,
assetType.name assetTypeName,
CONCAT(assigned.firstName,CONCAT(' ',assigned.lastName)) assignedTo,
asset.status, location.name locationName")
->leftJoin('asset.user', 'user')
->leftJoin('asset.assigned', 'assigned')
->leftJoin('asset.location', 'location')
->leftJoin('asset.assetType', 'assetType');
正如您可能已经注意到的,我有两个聚合列(assignedBy,AssignedTo)没有别名(如果可以的话,我会在第一个中写 user.assignedBy ,而在后一个中写相同,< strong>但在sql中是不可接受的,因为它们不属于任何实际的表。)
稍后,当在客户端提交表单时,我需要为它们添加类似的表达式。 (这是一种自动生成的查询,但为了简化,我将仅提及负责它的功能,并跳过其余部分) 此函数与$ _REQUEST中的数组一起使用。我把它作为指南:
array (size=9)
'assignedBy' => string 'mojtaba' (length=7)
'createdAt' => string '' (length=0)
'serial' => string '' (length=0)
'brand' => string '' (length=0)
'model' => string '' (length=0)
'assetType' => string '' (length=0)
'assigned' => string '' (length=0)
'location' => string '' (length=0)
'status' => string '' (length=0)
和功能:
/**
* @return $this
* @throws \CException
*/
public function applyFilter()
{
// it is the array came from $_REQUEST, I mentioned it above.
if (isset($_REQUEST[$this->getFilterKey()])) {
$or = $this->getQueryBuilder()->expr()->orX();
foreach ($_REQUEST[$this->getFilterKey()] as $key => $val) {
if ($val) {
$term = $key;
$or->add($this->getQueryBuilder()->expr()->like($term, ":" . $key));
$this->getQueryBuilder()->setParameters(array($key => "%" . $val . "%"));
}
}
($or->getParts()) ? $this->getQueryBuilder()->andWhere($or) : "";
}
return $this;
}
对于此查询中包含别名的所有列,绝对没有问题,但对于这两个,我收到此错误:
[Syntax Error] line 0, col 186: Error: Expected '.' or '(', got 'assignedBy'
并且真正的错误发生在这里:
vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(2541): Doctrine\ORM\Query\Parser->LikeExpression()
我已经读过QueryBuilder不支持Like表达式中的函数: Doctrine query + LIKE expression,但这是另一回事,我不需要使用函数,我想在queryBuilder别名表达式中使用没有别名的列,我得到此错误,任何帮助都将不胜感激。