Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 你能强迫教条';s querybuilder在where子句中不需要操作数?_Php_Mysql_Doctrine Orm - Fatal编程技术网

Php 你能强迫教条';s querybuilder在where子句中不需要操作数?

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 =, <, <=, <>, >, >=, !=

在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)")
问题是在第一种情况下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;
    }
}

您能给我们看一下您的代码以便更好地理解吗?当然!现在已经编辑好了。你能给我们看一下你的代码吗?当然可以!现在已经编辑好了。