gpt4 book ai didi

php - 为什么 Doctrine 使用 WHERE IN 而不是 LIMIT?

转载 作者:可可西里 更新时间:2023-11-01 13:25:10 26 4
gpt4 key购买 nike

为什么 Doctrine (1.2) 使用 WHERE IN 而不是 LIMIT

这段代码:

Doctrine_Query::create()
->from('Table t')
->limit(10)
->getSqlQuery();

返回这样的东西:

SELECT t.id_table AS t__id_table FROM table AS t WHERE t__id_table IN (1,2,3,4,10,12,18,20,21,25);

取而代之的是:

SELECT t.id_table AS t__id_table FROM table AS t LIMIT 10;

此行为对于任何 LIMIT 值都是相同的。这会为高 LIMIT 值生成非常长的查询。

额外问题:Doctrine 如何知道要使用什么 ID? (通过向数据库发送另一个查询??)

最佳答案

那是因为 LIMIT 操作的是数据库行而不是“对象”。当您键入 $q->limit(10) 时,您想要获取十个对象,而不是数据库中的十行。

考虑以下查询(产品和类别具有多对多关系):

SELECT p.*, c.* FROM product p 
INNER JOIN product_category_ref pcr ON p.id = pcr.prodcut_id
INNER JOIN category c ON c.id = pcr.category_id
WHERE p.price < 123;

要获取 10 个产品(对象),您的查询必须至少获取 20 行。您不能使用 LIMIT 10 因为(仅作为示例)只会退回 3 件产品。这就是为什么您需要找出应该获取哪些产品(限制适用于产品),然后再获取实际数据。

这将导致以下查询:

SELECT p.id FROM product p WHERE p.price < 123;
SELECT ..... WHERE p.id IN (...);

第二个查询可能返回 20、423 或 31 行。如您所见,这不是来自 limit() 的值。

附言。在这种情况下,Doctrine2 更加清晰,因为它使用 setMaxResults() 方法而不是 limit() 方法,后者不那么令人困惑。

关于php - 为什么 Doctrine 使用 WHERE IN 而不是 LIMIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4647547/

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