Saya ingin mendapatkan nilai dengan SQL berikut menggunakan Eloquent ORM.
- SQL
SELECT COUNT(*) FROM
(SELECT * FROM abc GROUP BY col1) AS a;
Kemudian saya mempertimbangkan yang berikut ini.
- Kode
$sql = Abc::from('abc AS a')->groupBy('col1')->toSql();
$num = Abc::from(\DB::raw($sql))->count();
print $num;
Saya mencari solusi yang lebih baik.
Tolong beri tahu saya solusi paling sederhana.
belongsToMany
sebagai subpilihan Anda harus menambahkangetQuery()
dua kali =>$sub->getQuery()->getQuery()
toSql
. Baca tentang PDO php.net/manual/en/book.pdo.php dan lihat hasil dari$query->toSql()
$sub
kueri adalah Eloquent Builder , maka Anda masih memerlukan->getQuery()
bagian tersebut, jika tidak, Anda akan mendapatkan kesalahan, karena metode ini diketikkan terhadapQuery\Builder
kelas.Laravel v5.6.12 (2018-03-14) ditambahkan
fromSub()
danfromRaw()
metode untuk membuat kueri (# 23476) .Jawaban yang diterima benar tetapi dapat disederhanakan menjadi:
Cuplikan di atas menghasilkan SQL berikut:
sumber
Solusi @JarekTkaczyk persis seperti yang saya cari. Satu-satunya hal yang saya lewatkan adalah bagaimana melakukannya saat Anda menggunakan
DB::table()
kueri. Dalam hal ini, inilah cara saya melakukannya:Perhatian khusus bagaimana membuat
mergeBindings
tanpa menggunakangetQuery()
metodesumber
DB::raw()
melakukan pekerjaan itu untuk sayaDari laravel 5.5 ada metode khusus untuk subkueri dan Anda dapat menggunakannya seperti ini:
atau
sumber
Call to undefined method subSelect()
sepertinyasubSelect
tidak ada.selectSub
. Saya telah memperbarui tanggapan saya sekarang.Saya suka melakukan sesuatu seperti ini:
Ini tidak terlalu elegan, tapi sederhana.
sumber
Saya tidak dapat membuat kode Anda untuk melakukan kueri yang diinginkan, AS adalah alias hanya untuk tabel
abc
, bukan untuk tabel turunan. Laravel Query Builder tidak secara implisit mendukung alias tabel turunan, DB :: raw kemungkinan besar diperlukan untuk ini.Solusi paling langsung yang dapat saya berikan hampir sama dengan solusi Anda, namun menghasilkan kueri seperti yang Anda minta:
Kueri yang dihasilkan adalah
sumber
Cara yang benar dijelaskan dalam jawaban ini: https://stackoverflow.com/a/52772444/2519714 Jawaban paling populer saat ini tidak sepenuhnya benar.
Cara ini https://stackoverflow.com/a/24838367/2519714 tidak benar dalam beberapa kasus seperti: sub pilih memiliki binding, lalu bergabung dengan tabel ke sub pilih, lalu yang lain ditambahkan ke semua kueri. Contoh query:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
Untuk membuat query ini Anda akan menulis kode seperti:Selama menjalankan kueri ini, metodenya
$query->getBindings()
akan mengembalikan binding dalam urutan yang salah seperti['val3', 'val1', 'val4']
dalam kasus ini, bukan mengoreksi['val1', 'val3', 'val4']
sql mentah yang dijelaskan di atas.Sekali lagi cara yang benar untuk melakukan ini:
Binding juga akan secara otomatis dan benar digabungkan ke kueri baru.
sumber