2011-09-02 23 views
11

當我在查詢上調用setMaxResults時,它似乎想將最大數字視爲「2」,無論它的實際值是多少。

function findMostRecentByOwnerUser(\Entities\User $user, $limit) 
{ 
    echo "2: $limit<br>"; 
    $query = $this->getEntityManager()->createQuery(' 
     SELECT t 
     FROM Entities\Thread t 
     JOIN t.messages m 
     JOIN t.group g 
     WHERE 
      g.ownerUser = :owner_user 
     ORDER BY m.timestamp DESC 
    '); 
    $query->setParameter("owner_user", $user); 
    $query->setMaxResults(4); 
    echo $query->getSQL()."<br>"; 
    $results = $query->getResult(); 
    echo "3: ".count($results); 
    return $results; 
} 

當我註釋掉setMaxResults這一行時,我得到了6個結果。當我離開時,我得到了最近的兩個結果。當我在phpMyAdmin中運行生成的SQL代碼時,我得到了4個最新的結果。生成的SQL,以供參考,是:

SELECT <lots of columns, all from t0_> 
FROM Thread t0_ 
INNER JOIN Message m1_ ON t0_.id = m1_.thread_id 
INNER JOIN Groups g2_ ON t0_.group_id = g2_.id 
WHERE g2_.ownerUser_id = ? 
ORDER BY m1_.timestamp DESC 
LIMIT 4 

編輯

在閱讀the DQL "Limit" documentation,我碰上了以下內容:

如果查詢包含一個fetch-加入集合,指定結果限制方法不像您期望的那樣工作。設置最大結果數限制了數據庫結果行的數量,但是在獲取連接集合的情況下,一個根實體可能出現在許多行中,從而有效地保證少於指定數量的結果。

我敢肯定,我沒有做一個獲取 - 加入收藏。我的印象是,加入了一個獲取加入的集合是我做類似SELECT t, m FROM Threads JOIN t.messages的地方。我的理解是否不正確?

+0

我剛剛注意到與教條2.2相同的問題。我很驚訝,有沒有解決方法... – Gregoire

回答

10
+1

不知何故,我從來沒有得到這個工作(記得之前做,但無法讓它現在的工作)。下載Symfony上週和/var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php告訴我它是版本2.3.0從你的鏈接運行的代碼與多對多的關係給我無論我使用的setMaxResults的值是多少(計數($ paginator))。 – HMR

1

我通過僅取主表的內容,並且具有所有加入取出作爲fetch="EAGER"表其在實體定義解決了同樣的問題(此處http://www.doctrine-project.org/docs/orm/2.1/en/reference/annotations-reference.html?highlight=eager#manytoone描述)。

class VehicleRepository extends EntityRepository 
{ 
    /** 
    * @var integer 
    */ 
    protected $pageSize = 10; 

    public function page($number = 1) 
    { 
     return $this->_em->createQuery('SELECT v FROM Entities\VehicleManagement\Vehicles v') 
      ->setMaxResults(100) 
      ->setFirstResult($number - 1) 
      ->getResult(); 
    } 
} 

在我的示例repo中,您可以看到我只抓取車輛表以獲得正確的結果數量。但是所有的屬性(如make,model,category)都會立即被獲取。

(我也遍歷實體-內容,因爲我需要的實體表示爲一個數組,但是這不應該事據我所知)

下面是我的實體的摘錄:

class Vehicles 
{ 
    ... 

    /** 
    * @ManyToOne(targetEntity="Makes", fetch="EAGER") 
    * @var Makes 
    */ 
    public $make; 

    ... 
} 

它的重要你映射每個實體正確否則它將無法正常工作。

5

使用->groupBy('your_entity.id')似乎解決了這個問題!

+0

我剛試過這個。起初它似乎工作,但它看起來像限制了獲取連接表中的結果。 –