在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;
}
}