你可以强制学说的查询生成器不要期望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") 

这也不会工作。

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