Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memilih Elegan daripada Subkueri menggunakan Pembina Pertanyaan Laravel?
Pilih data secara elegan daripada subkueri menggunakan pembina pertanyaan Laravel
Dalam projek baru-baru ini, anda menggunakan Eloquent ORM untuk mendapatkan semula data daripada pangkalan data. Salah satu keperluan adalah menggunakan subquery untuk mengira bilangan rekod dalam lajur tertentu. Berikut ialah pertanyaan SQL yang anda cuba laksanakan:
<code class="language-sql">SELECT COUNT(*) FROM (SELECT * FROM abc GROUP BY col1) AS a;</code>
Percubaan pertama anda menggunakan kaedah from()
dan groupBy()
model Abc:
<code class="language-php">$sql = Abc::from('abc AS a')->groupBy('col1')->toSql(); $num = Abc::from(\DB::raw($sql))->count(); print $num;</code>
Walau bagaimanapun, anda sedang mencari penyelesaian yang lebih elegan.
Penyelesaian lengkap
Pembina pertanyaan Laravel tidak mempunyai cara langsung untuk membuat subkueri dalam klausa FROM. Oleh itu, anda perlu membina pernyataan SQL mentah secara manual. Untuk melakukan ini, anda boleh menggunakan kaedah berikut:
<code class="language-php">$sub = Abc::where(...)->groupBy(...); // Eloquent Builder 实例 $count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // 合并所有绑定 ->count();</code>
Untuk memastikan hasil yang tepat, pastikan anda menggabungkan ikatan dalam susunan yang betul. Jika anda mempunyai klausa mengikat lain, anda harus meletakkannya selepas mergeBindings()
:
<code class="language-php">$count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) // ->where(...) 错误的位置 ->mergeBindings($sub->getQuery()) // 合并绑定 // ->where(...) 正确的位置 ->count();</code>
Penyelesaian ini menyediakan cara yang mudah dan cekap untuk melaksanakan subkueri yang mengandungi syarat dan pengikatan yang kompleks.
Atas ialah kandungan terperinci Bagaimana untuk Memilih Elegan daripada Subkueri menggunakan Pembina Pertanyaan Laravel?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!