Saya telah menemukan konsep dan makna di balik metode ini menjadi sedikit membingungkan, apakah mungkin bagi seseorang untuk menjelaskan kepada saya apa perbedaan antara has
dan with
dalam konteks contoh (jika mungkin)?
sumber
Saya telah menemukan konsep dan makna di balik metode ini menjadi sedikit membingungkan, apakah mungkin bagi seseorang untuk menjelaskan kepada saya apa perbedaan antara has
dan with
dalam konteks contoh (jika mungkin)?
with()
untuk pemuatan yang cepat . Itu pada dasarnya berarti, di sepanjang model utama, Laravel akan melakukan preload hubungan yang Anda tentukan. Ini sangat membantu jika Anda memiliki koleksi model dan Anda ingin memuat relasi untuk semuanya. Karena dengan pemuatan yang cepat Anda hanya menjalankan satu permintaan DB tambahan alih-alih satu untuk setiap model dalam koleksi.
Contoh:
User > hasMany > Post
$users = User::with('posts')->get();
foreach($users as $user){
$users->posts; // posts is already loaded and no additional DB query is run
}
has()
adalah menyaring model pemilihan berdasarkan suatu hubungan. Jadi itu bertindak sangat mirip dengan kondisi WHERE normal. Jika Anda hanya menggunakan has('relation')
itu berarti Anda hanya ingin mendapatkan model yang memiliki setidaknya satu model terkait dalam hubungan ini.
Contoh:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
whereHas()
bekerja pada dasarnya sama seperti has()
tetapi memungkinkan Anda untuk menentukan filter tambahan untuk model terkait untuk diperiksa.
Contoh:
User > hasMany > Post
$users = User::whereHas('posts', function($q){
$q->where('created_at', '>=', '2015-01-01 00:00:00');
})->get();
// only users that have posts from 2015 on forward are returned
with('relation')
akan menyertakan data tabel terkait dalam koleksi yang dikembalikan,has('relation')
dan tidakwhereHas('relation')
akan menyertakan data tabel terkait. Jadi, Anda mungkin perlu untuk memanggil kedua serta atau .with('relation')
has()
whereHas()
whereHas
pada relasi pengguna saat meminta posting.whereHas
menggunakanuse Illuminate\Database\Eloquent\Builder;
yang kemudian denganfunction(Builder $query)
. Sebagian besar contoh yang saya lihat, gunakan titikBuilder
, cukup masukkan $ query, yang merupakan cara yang benar?Dokumen sudah menjelaskan penggunaannya. Jadi saya menggunakan SQL untuk menjelaskan metode ini
Contoh:
Anggap ada yang
Order (orders)
punya banyakOrderItem (order_items)
.Dan Anda sudah membangun hubungan di antara mereka.
Ketiga metode ini didasarkan pada suatu hubungan .
Dengan
Hasil:
with()
mengembalikan objek model dan hasil terkait.Keuntungan: Ini adalah bersemangat-loading yang dapat mencegah N + 1 masalah .
Saat Anda menggunakan Eloquent Builder berikut:
Laravel mengubah kode ini menjadi hanya dua SQL :
Dan kemudian laravel menggabungkan hasil dari SQL kedua sebagai berbeda dari hasil SQL pertama dengan kunci asing . Akhirnya mengembalikan hasil pengumpulan.
Jadi, jika Anda memilih kolom tanpa foreign_key di penutupan, hasil hubungan akan kosong:
Memiliki
Has
akan mengembalikan objek model yang hubungannya tidak kosong .Laravel mengubah kode ini menjadi satu SQL :
dimana
whereHas
danorWhereHas
metode untuk menempatkanwhere
kondisi padahas
kueri Anda . Metode ini memungkinkan Anda untuk menambahkan batasan khusus ke batasan hubungan .Laravel mengubah kode ini menjadi satu SQL :
sumber