6

为什么学说(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 发送另一个查询??)

4

2 回答 2

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()更容易混淆的方法。

于 2011-01-10T14:23:16.097 回答
0

使用教义 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

您的代码中是否还有其他事情发生?

于 2011-01-10T15:05:51.573 回答