Memanfaatkan Pembina Pertanyaan Doktrin 2 untuk WHERE…IN Subqueries
Panduan ini menunjukkan cara membina pertanyaan Doktrin 2 untuk memilih item pesanan unik yang mengandungi item tertentu. Pertanyaan SQL yang setara ialah:
<code class="language-sql">SELECT DISTINCT i.id, i.name, order.name FROM items i JOIN orders o ON i.order_id=o.id WHERE o.id IN ( SELECT o2.id FROM orders o2 JOIN items i2 ON i2.order_id=o2.id AND i2.id=5 ) AND i.id != 5 ORDER BY o.orderdate DESC LIMIT 10</code>
Berikut ialah cara untuk meniru ini menggunakan pembina pertanyaan Doktrin 2:
<code class="language-php">/** @var Doctrine\ORM\EntityManager $em */ $expr = $em->getExpressionBuilder(); $qb = $em->createQueryBuilder(); $qb->select(array('DISTINCT i.id', 'i.name', 'o.name')) ->from('Item', 'i') ->join('i.order', 'o') ->where( $expr->in( 'o.id', $qb->createSubquery() ->select('o2.id') ->from('Order', 'o2') ->join('o2.items', 'i2') // Assuming a proper relationship ->where($expr->eq('i2.id', '?1')) ->getDQL() ) ) ->andWhere($expr->neq('i.id', '?2')) ->orderBy('o.orderdate', 'DESC') ->setMaxResults(10) // Use setMaxResults for LIMIT ->setParameter(1, 5) ->setParameter(2, 5); $query = $qb->getQuery(); $results = $query->getResult();</code>
Kod pembina pertanyaan yang dipertingkatkan ini menggunakan subkueri dengan lebih cekap. Ia menganggap hubungan yang ditakrifkan dengan betul antara Order
dan Item
entiti. setMaxResults(10)
digunakan dan bukannya bergantung pada pengehadan subkueri yang berpotensi. Ingat bahawa entiti Item
dan Order
mesti wujud dalam pemetaan Doktrin 2 anda. Ujian menyeluruh masih disyorkan untuk mengendalikan kes tepi yang berpotensi.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Subquery WHERE…IN Menggunakan Pembina Pertanyaan Doctrine 2?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!