Php 你能强迫教条';s querybuilder在where子句中不需要操作数?
在SQL中,可以使where语句为true,而无需实际编写“column=true”。相反,您可以使用“column”,然后查询将返回其为真的所有行 据我所知,这在doctrine的查询生成器中是不可能的,当我尝试任何类似的操作时,会抛出以下QueryException:Php 你能强迫教条';s querybuilder在where子句中不需要操作数?,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,在SQL中,可以使where语句为true,而无需实际编写“column=true”。相反,您可以使用“column”,然后查询将返回其为真的所有行 据我所知,这在doctrine的查询生成器中是不可能的,当我尝试任何类似的操作时,会抛出以下QueryException: [Syntax Error] line 0, col 428: Error: Expected =, <, <=, <>, >, >=, !=
[Syntax Error] line 0, col 428: Error: Expected =, <, <=, <>, >, >=, !=, got 'AND'
有没有办法绕过这个问题?它必须是一个涉及查询生成器的解决方案
编辑:
下面是有问题的代码:
$qb->andWhere("MBRContains(:linestring, location.position) = true")
我非常想成为:
$qb->andWhere("MBRContains(:linestring, location.position)")
问题是在第一种情况下MBR不使用空间索引。这是一个条令扩展,但问题可以简化为:
$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;
}
}
既然我找到了解决方案,我想我应该把它贴在这里,以防其他人也会遇到同样的问题
您需要一个定制的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;
}
}
您能给我们看一下您的代码以便更好地理解吗?当然!现在已经编辑好了。你能给我们看一下你的代码吗?当然可以!现在已经编辑好了。