Pet*_*ler 6 php doctrine doctrine-1.2
为什么学说(1.2)使用WHERE IN
而不是LIMIT
?
这段代码:
Doctrine_Query::create()
->from('Table t')
->limit(10)
->getSqlQuery();
Run Code Online (Sandbox Code Playgroud)
返回如下内容:
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);
Run Code Online (Sandbox Code Playgroud)
而不是这个:
SELECT t.id_table AS t__id_table FROM table AS t LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
任何LIMIT
值的这种行为都是相同的.这会为高LIMIT
值生成非常长的查询.
奖金问题:Doctrine如何知道,使用什么ID?(通过向DB发送另一个查询??)
这是因为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;
Run Code Online (Sandbox Code Playgroud)
要获取 10 个产品(对象),您的查询必须至少获取 20 行。您不能使用LIMIT 10
原因(仅作为示例)仅退回 3 件产品。这就是为什么您需要找出应该获取哪些产品(限制适用于产品),然后获取实际数据。
这将导致以下查询:
SELECT p.id FROM product p WHERE p.price < 123;
SELECT ..... WHERE p.id IN (...);
Run Code Online (Sandbox Code Playgroud)
第二个查询可能返回 20、423 或 31 行。正如您所看到的,这不是来自 的值limit()
。
附言。在这种情况下,Doctrine2 更加清晰,因为它使用的是setMaxResults()
方法,而不是limit()
更容易混淆的方法。