在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")
哪个也行不通。
答案 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;
}
}