gpt4 book ai didi

php - 你能强制 doctrine query builder 不期望 where 子句中的操作数吗?

转载 作者:行者123 更新时间:2023-11-30 21:53:54 28 4
gpt4 key购买 nike

在 SQL 中,可以使 where 语句为真,而无需实际编写“column = true”。相反,您可以使用“列”,然后查询将返回所有为真的行。

据我所知,这在 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")

这也行不通。

最佳答案

既然我找到了解决方案,我想我会把它贴在这里,以防其他人遇到同样的问题。

您将需要一个自定义的 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;
}
}

关于php - 你能强制 doctrine query builder 不期望 where 子句中的操作数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46049094/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com