你可以强制学说的查询生成器不要期望where子句中的操作数吗?
问题描述:
在SQL中,可以使where语句成为true,而不实际编写'column = true'。相反,您可以使用“列”,然后查询将返回所有行。你可以强制学说的查询生成器不要期望where子句中的操作数吗?
至于我能弄清楚,这不是教条的查询生成器的可能性,当我尝试了类似的话,下面的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 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;
}
}
能否请您告诉我们您的代码来理解呢? –
当然!它现在已被编辑。 –