2011-09-02 40 views
11

Khi tôi gọi setMaxResults trên một truy vấn, có vẻ như muốn coi số tối đa là "2", bất kể giá trị thực của nó là gì.

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; 
} 

Khi tôi nhận xét dòng setMaxResults, tôi nhận được 6 kết quả. Khi tôi bỏ nó vào, tôi nhận được 2 kết quả gần đây nhất. Khi tôi chạy mã SQL được tạo ra trong phpMyAdmin, tôi nhận được 4 kết quả gần đây nhất. SQL được tạo ra, để tham khảo, là:

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 

Sửa:

Trong khi đọc the DQL "Limit" documentation, tôi đi qua như sau:

Nếu truy vấn của bạn chứa một fetch- bộ sưu tập được kết hợp chỉ định các phương thức giới hạn kết quả không hoạt động như bạn mong đợi. Đặt các kết quả tối đa hạn chế số lượng các hàng kết quả cơ sở dữ liệu, tuy nhiên trong trường hợp các bộ sưu tập được tìm nạp, một thực thể gốc có thể xuất hiện trong nhiều hàng, hiệu quả hydrat hóa ít hơn số lượng kết quả đã chỉ định.

Tôi khá chắc chắn rằng tôi không thực hiện bộ sưu tập tìm nạp. Tôi theo ấn tượng rằng một bộ sưu tập được lấy tham gia là nơi tôi làm một cái gì đó như SELECT t, m FROM Threads JOIN t.messages. Tôi có hiểu lầm về điều này không?

+0

Tôi vừa nhận thấy cùng một vấn đề với học thuyết 2.2. Tôi ngạc nhiên rằng không có cách giải quyết cho điều đó ... – Gregoire

Trả lời

10

Cập nhật: Với Doctrine 2.2 + bạn có thể sử dụng Paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

+1

Bằng cách nào đó tôi không bao giờ làm việc này (hãy nhớ làm điều đó trước nhưng không thể làm cho nó hoạt động ngay bây giờ). Đã tải xuống Symfony tuần trước và /var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php cho tôi biết đó là phiên bản 2.3.0 Chạy mã từ liên kết của bạn với quan hệ nhiều đến nhiều sẽ mang lại cho tôi một số ($ paginator) của 2143 không có vấn đề gì giá trị của setMaxResults tôi sử dụng. – HMR

1

Tôi đã giải quyết vấn đề tương tự bằng cách chỉ tìm nạp nội dung của bảng chính và có tất cả các bảng đã được tìm nạp là fetch="EAGER" được xác định trong Thực thể (được mô tả tại đây 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(); 
    } 
} 

Trong ví dụ của tôi, bạn có thể thấy tôi chỉ tìm nạp bảng xe để có được kết quả chính xác. Nhưng tất cả các thuộc tính (như make, model, category) đều được tải ngay lập tức.

(. Tôi cũng lặp qua Entity-nội dung bởi vì tôi cần Entity biểu diễn dưới dạng một mảng, nhưng điều đó không nên vấn đề afaik)

Dưới đây là một đoạn trích từ thực thể của tôi:

class Vehicles 
{ 
    ... 

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

    ... 
} 

quan trọng rằng bạn ánh xạ mọi Thực thể một cách chính xác nếu không nó sẽ không hoạt động.

5

Sử dụng ->groupBy('your_entity.id') dường như để giải quyết vấn đề này!

+0

Tôi vừa thử điều này. Lúc đầu nó dường như làm việc nhưng có vẻ như nó đang hạn chế kết quả trong các bảng tìm nạp. –