Subquery (pembina pertanyaan 12)
Mula-mula bina SQL subquery Anda boleh menggunakan tiga kaedah berikut untuk membina subquery.
Gunakan kaedah fetchSql
kaedah fetchSql bermaksud tidak untuk bertanya tetapi hanya mengembalikan pernyataan SQL yang dibina, dan bukan sahaja menyokong pilih, tetapi menyokong semua pertanyaan CURD. Hasil subQuery yang dijana oleh
$subQuery = Db::table('think_user') ->field('id,name') ->where('id', '>', 10) ->fetchSql(true) ->select();
ialah:
SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
Menggunakan buildSql untuk membina subquery
$subQuery = Db::table('think_user') ->field('id,name') ->where('id', '>', 10) ->buildSql();
Hasil subQuery yang dijana ialah:
( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )
Selepas operasi memanggil, kaedah buildSql bukan sahaja akan dijalankan. pertanyaan akan dijana Pernyataan SQL (untuk mengelakkan kekeliruan, kurungan akan ditambah pada kedua-dua belah SQL), dan kemudian kami memanggilnya secara langsung dalam pertanyaan berikutnya.
Kemudian gunakan subquery untuk membina pertanyaan baharu:
Db::table($subQuery . ' a') ->where('a.name', 'like', 'thinkphp') ->order('id', 'desc') ->select();
Pernyataan SQL yang dihasilkan ialah:
SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc
Gunakan penutupan untuk membina subquery
Soalan seperti IN/TIDAK ADA dan WUJUD secara langsung Penutupan sebagai subkueri, contohnya:
Db::table('think_user') ->where('id', 'IN', function ($query) { $query->table('think_profile')->where('status', 1)->field('id'); }) ->select();
Pernyataan SQL yang dijana ialah
SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
Db::table('think_user') ->whereExists(function ($query) { $query->table('think_profile')->where('status', 1); })->find();
Penyataan SQL yang dijana ialah
SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )
Selain syarat pertanyaan di atas, operasi perbandingan juga menyokong penggunaan subkueri penutupan