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!
Bạn có thể sử dụng chức năng setMaxResults của QueryBuilder không? – Michael
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
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