Mengoptimumkan WHERE ... IN
Subkueri dalam Ajaran 2
Mendapatkan semula item pesanan yang dikaitkan dengan pesanan yang mengandungi item tertentu memberikan cabaran dalam rangka kerja Doktrin 2. Penyelesaian SQL yang mudah kelihatan seperti ini:
<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>
Pertanyaan SQL ini mencapai hasil yang diinginkan dengan cekap. Walau bagaimanapun, mereplikasi ini terus dalam pembina pertanyaan Doktrin 2 memerlukan pendekatan yang lebih bernuansa:
<code class="language-php">$expr = $em->getExpressionBuilder(); $em->createQueryBuilder() ->select(array('DISTINCT i.id', 'i.name', 'o.name')) ->from('Item', 'i') ->join('i.order', 'o') ->where( $expr->in( 'o.id', $em->createQueryBuilder() ->select('o2.id') ->from('Order', 'o2') ->join('Item', 'i2', \Doctrine\ORM\Query\Expr\Join::WITH, $expr->andX( $expr->eq('i2.order', 'o2'), $expr->eq('i2.id', '?1') )) ->getDQL() ) ) ->andWhere($expr->neq('i.id', '?2')) ->orderBy('o.orderdate', 'DESC') ->setParameter(1, 5) ->setParameter(2, 5);</code>
Kod Doktrin 2 ini menyediakan persamaan fungsian. Ambil perhatian bahawa pelarasan khusus model mungkin diperlukan. Bidang untuk pemurnian berpotensi termasuk mengoptimumkan prestasi klausa IN
dengan subkueri, meneroka alternatif untuk meningkatkan kecekapan dan berpotensi menyatukan dua parameter menjadi satu untuk kebolehbacaan yang lebih baik. Contoh ini berfungsi sebagai asas untuk mencipta penyelesaian yang mantap dan cekap.
Atas ialah kandungan terperinci Bagaimana untuk Cekap Melakukan WHERE ... IN Subquery dengan Doktrin 2?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!