gpt4 book ai didi

php - 有没有办法在 Doctrine ORM 中将 LIMIT 添加到 UPDATE 查询?

转载 作者:可可西里 更新时间:2023-10-31 23:15:38 25 4
gpt4 key购买 nike

我正在使用 Doctrine 2.5.x,但在让 LIMIT 子句用于 UPDATE 查询时遇到了问题。它总是更新所有匹配的记录(即它似乎忽略了 LIMIT 子句)。

setMaxResults() 与 UPDATE 查询一起使用时似乎没有效果。

作为一种快速解决方法,我正在使用 native MySQL 查询,但这不是最佳解决方案。

我尝试了这些示例,但没有一个有效:

Doctrine update query with LIMIT

https://recalll.co/app/?q=doctrine2%20-%20Doctrine%20update%20query%20with%20LIMIT

带有 setMaxResults() 的 QueryBuilder(不起作用):

$qb = $em->createQueryBuilder();

$query = $qb->update('\Task\Entity', 't')
->set('t.ClaimedBy', 1)
->where('t.Claimed IS NULL')
->getQuery();
$query->setMaxResults(20);

$this->log($query->getSQL());

希望有人可以帮助找到比 native 查询更好的解决方案。它带走了 ORM 的全部好处。

甚至可以在 UPDATE 语句中使用 LIMIT 子句吗?

最佳答案

简而言之,不,因为 SQL 规范不支持 UPDATE ... LIMIT ...,所以没有一个试图实现可移植性的 ORM 应该允许您这样做。


请同时查看 MySQL Reference Manual本身声明 UPDATE ... LIMIT ... 不是标准的 SQL 结构:

MySQL Server supports some extensions that you probably will not find in other SQL DBMSs. Be warned that if you use them, your code will not be portable to other SQL servers. In some cases, you can write code that includes MySQL extensions, but is still portable, by using comments of the following form:

  • SQL statement syntax
    • The ORDER BY and LIMIT clauses of the UPDATE and DELETE statements.

所以从本质上讲,因为您要实现的不是标准 SQL,ORM 将没有可移植的方式来实现它,并且可能根本不会实现它。


抱歉,您尝试实现的目标无法通过 DQL 实现,因为:

Ocramius commented on Sep 2, 2014
DQL doesn't allow limit on UPDATE queries, as it is not portable.

this issue 中的建议DoctrineBundle 存储库的所有者 Marco Pivetta(他恰好也是 ORM 存储库的所有者)。

更多信息,虽然它可能需要一个很好的链接到正确的 ISO 规范文档,遗憾的是不能免费获得:

ISO 标准UPDATE指令不允许UPDATE 中允许 LIMIT , 其中SELECT当然,这是一条允许它的指令。

正如您自己提出的那样,ORM 的目的是不编写纯 SQL 以使其跨 DBMS 兼容。如果不可能那样做,那么 ORM 没有实现它是有道理的。

另请注意,在除 MYSQL 之外的其他 SQL 变体上,限制实际上是 SELECT 子句的一部分:

select * from demo limit 10

将在 SQL Server 中转换为

select top 10 from demo

或者在 Orcale 中

select * from demo WHERE rownum = 1

另见:https://stackoverflow.com/a/1063937/2123530

关于php - 有没有办法在 Doctrine ORM 中将 LIMIT 添加到 UPDATE 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44216276/

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