你能强迫 doctrine 的查询生成器不要期望在 where 子句中使用操作数吗?



在sql中,可以做出一个正确的语句,而无需实际编写'column = true'。相反,您可以使用"列",然后查询将返回所有行的所有行。

据我所知,这在学说的查询构建器中不是可能的,当我尝试类似的内容时,抛出以下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")

这也行不通。

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

您将需要一个自定义的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 DoctrineORMQuerySqlWalker;
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;
    }
}

相关内容

  • 没有找到相关文章

最新更新