为什么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? (通过向DB发送另一个查询??)
答案 0 :(得分:4)
那是因为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()
的值。
PS。在这种情况下,Doctrine2更加清晰,因为它使用的是setMaxResults()
方法,而不是limit()
,这样可以减少混淆。
答案 1 :(得分:0)
使用Doctrine 1.2.3:
<?php
include(dirname(__FILE__).'/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'testdb', 'testdb');
$conn = Doctrine_Manager::connection($dbh);
class Table extends Doctrine_Record {
public function setTableDefinition() {
$this->hasColumn('id_table', integer, 10, array('primary' => true));
}
}
$q = Doctrine_Query::create()
->from('Table t')
->limit(10)
->getSqlQuery();
echo $q;
我得到了结果:
SELECT t.id_table AS t__id_table FROM table t LIMIT 10
您的代码中是否还有其他内容?