如何在QueryBuilder中为没有别名的列添加LIKE表达式

时间:2016-01-03 15:11:00

标签: php mysql doctrine-orm query-builder sql-like

我正在使用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别名表达式中使用没有别名的列,我得到此错误,任何帮助都将不胜感激。

0 个答案:

没有答案