您是否可以强制doctrine的querybuilder不期望where子句中的操作数?

时间:2017-09-05 07:19:17

标签: php mysql doctrine-orm

在SQL中,可以使where语句成为true,而不实际写入'column = true'。相反,你可以使用'column',然后查询将返回它所有的行。

据我所知,这在doctrine的查询构建器中不可能,当我尝试类似的东西时,抛出以下QueryException:

[Syntax Error] line 0, col 428: Error: Expected =, <, <=, <>, >, >=, !=, got 'AND'

有什么方法可以解决这个问题吗?它必须是涉及查询构建器的解决方案。

编辑:

以下是相关代码:

$qb->andWhere("MBRContains(:linestring, location.position) = true")

我非常想成为:

$qb->andWhere("MBRContains(:linestring, location.position)")

问题是MBRContains在第一种情况下不使用空间索引。 MBRContains来自学说扩展,但问题可以简化为:

$qb->andWhere("account.email_validated")

哪个也行不通。

1 个答案:

答案 0 :(得分:0)

由于我找到了解决方案,我想我会在这里发布,以防其他人遇到同样的问题。

您需要自定义SqlWalker,您必须将其应用于您的查询。由于我使用的是QueryBuilder,因此在应用walker之前必须先获取查询。无论如何,这里是代码:

$query = $qb->getQuery;
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CustomSqlWalker::class);
$query->setHint(UseIndexWalker::HINT_REMOVE_EQUAL_TRUE, true);

SqlWalker看起来像这样:

<?php
namespace YOUR_NAME_SPACE;

use Doctrine\ORM\Query\SqlWalker;

class CustomSqlWalker extends SqlWalker {
    const HINT_REMOVE_EQUAL_TRUE = 'CustomSqlWalker.RemoveEqualTrue';

    public function walkWhereClause($whereClause) {
        $result = parent::walkWhereClause($whereClause);

        if ($this->getQuery()->getHint(self::HINT_REMOVE_EQUAL_TRUE)) {
            $result = preg_replace('/= 1/', '', $result);
        }

        return $result;
    }
}