2013-01-09 29 views
13

Tôi đang cố sử dụng truy vấn con trong câu lệnh IN trong Doctrine2.Doctrine 2 limit IN subquery

Dưới đây là những gì các truy vấn SQL thô nên hình như:

SELECT * FROM license 
WHERE id 
IN (SELECT id 
    FROM license 
    WHERE subscription = x 
    ORDER BY date DESC 
    LIMIT 5) 
ORDER BY name ASC; 

Những gì tôi muốn làm là hiển thị kết quả mới nhất 5 lệnh theo tên, vì vậy tôi phải đầu tiên truy vấn 5 kết quả cuối cùng và sau đó tự do tên trong truy vấn chính.

Vấn đề là tôi dường như không thể giới hạn truy vấn bên trong.

Đây là mã hiện tại của tôi:

$qb = $this->createQueryBuilder('l'); 
$qb->select('l.id'); 
$qb = $this->whereSubscriptionId($qb, $subscription_id); 
$qb = $this->offsetLimitOrder($qb, 0, 5, 'deliveryDatetime desc'); 

//Second Query, adds the "order by X" 
$qb2 = $this->createQueryBuilder('l2'); 
$qb2->add('where', $qb2->expr()->in('l2.id', $qb->getQuery()->getDQL())); 
if(isset($order)){ 
    $order = explode(' ', $order); 
    $qb2->addOrderBy('l2.'.$order[0], $order[1]); 
} 

return $qb2->getQuery() 
      ->getResult(); 

Như bạn thấy, tôi có thể tạo truy vấn đầu tiên của tôi, tôi đặt hàng và hạn chế nó (thông qua một phương pháp tùy chỉnh) và sau đó tôi cố gắng sử dụng nó trong các truy vấn thứ hai. Tuy nhiên, có vẻ như LIMIT không phải là một phần của tuyên bố DQL vì khi tôi var_dump DQL của truy vấn đầu tiên, LIMIT không có, nghĩa là nó hoàn toàn bị bỏ qua khi tôi chạy $ qb2-> getQuery() -> getResult();

Tôi đã làm cho nó hoạt động bằng cách khởi chạy truy vấn đầu tiên và nhập thủ công kết quả vào lần truy vấn thứ hai, nhưng nó rất xấu.

Bất kỳ ý tưởng nào về cách thực hiện đúng cách?

Cảm ơn!

+0

Bạn có thể sử dụng chức năng setMaxResults của QueryBuilder không? – Michael

+1

có, bạn có thể tạo 2 trình tạo truy vấn, một cho phép chọn IN và một cho DQL toàn cầu. trong phần đầu tiên, sử dụng 'setMaxResults'. – Florian

+1

Dường như lý do chính cho giới hạn không được bao gồm trong DQL là bộ nhớ đệm - http://www.doctrine-project.org/jira/browse/DDC-885 – gregor

Trả lời

14

Thật không may Doctrine không hỗ trợ giới hạn đối với truy vấn lồng nhau. Thậm chí nếu bạn sử dụng 2 QueryBuilders và setMaxResults() trên QueryBuilder bên trong, nó sẽ bị bỏ qua.

Cách duy nhất để thực hiện việc này tại thời điểm này là chạy 2 truy vấn riêng lẻ.

+1

Điều này thực sự không may. Tôi đã nhìn vào mã của tôi trong một giờ cố gắng tìm ra những gì sai. Doctrine ít nhất có thể ném một ngoại lệ nói rằng nó không được hỗ trợ. – NSAddict

+0

Đánh dấu điều này là câu trả lời bởi vì trong khi nó không giúp đỡ, nó đã xác nhận những nghi ngờ của tôi rằng nó không thể thực hiện được. – Growiel

+0

Ở đây http://stackoverflow.com/questions/24068947/subquery-with-limit-in-doctrine có thể là giải pháp –

Các vấn đề liên quan