Bu yöntemlerin arkasındaki kavram ve anlamı biraz kafa karıştırıcı buldum, birisinin bana arasındaki farkın ne olduğunu açıklaması mümkün mü has
ve with
bir örnek bağlamında (eğer mümkünse) içinde, nedir?
Bu yöntemlerin arkasındaki kavram ve anlamı biraz kafa karıştırıcı buldum, birisinin bana arasındaki farkın ne olduğunu açıklaması mümkün mü has
ve with
bir örnek bağlamında (eğer mümkünse) içinde, nedir?
Yanıtlar:
with()
için istekli yükleme . Bu temel olarak, ana model boyunca Laravel, belirttiğiniz ilişkileri önceden yükleyeceği anlamına gelir. Bu, özellikle bir model koleksiyonunuz varsa ve hepsi için bir ilişki yüklemek istiyorsanız yararlıdır. Çünkü istekli yükleme ile koleksiyondaki her model için bir yerine bir ek DB sorgusu çalıştırın.
Misal:
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()
seçme modelini bir ilişkiye göre filtrelemektir. Yani normal bir WHERE durumuna çok benzer şekilde hareket eder. Eğer bunu kullanırsanız has('relation')
, sadece bu ilişkide en az bir ilgili modeli olan modelleri elde etmek istersiniz.
Misal:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
whereHas()
temel olarak aynı şekilde çalışır, has()
ancak ilgili modelin kontrol etmesi için ek filtreler belirtmenize olanak tanır.
Misal:
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
whereHas
kullanıcı ilişkisini kullanın .
whereHas
o zaman use Illuminate\Database\Eloquent\Builder;
hangisi ile kullanır function(Builder $query)
. Gördüğüm çoğu örnek, nokta kullanın Builder
, sadece $ sorgusu geçmek, hangi doğru yol?
Belge zaten kullanımı açıkladı. Bu yüzden bu yöntemleri açıklamak için SQL kullanıyorum
Var olduğunu varsayarsak Order (orders)
çok vardır OrderItem (order_items)
.
Ve zaten aralarındaki ilişkiyi kurdunuz.
// App\Models\Order:
public function orderItems() {
return $this->hasMany('App\Models\OrderItem', 'order_id', 'id');
}
Bu üç yöntemin hepsi bir ilişkiye dayanır .
Sonuç: with()
model nesnesini ve ilgili sonuçlarını döndürür.
Avantaj: Öyle istekli yükleme olabilir N + 1 sorunu önlemek .
Aşağıdaki Eloquent Builder'ı kullanırken:
Order::with('orderItems')->get();
Laravel bu kodu sadece iki SQL olarak değiştirir :
// get all orders:
SELECT * FROM orders;
// get the order_items based on the orders' id above
SELECT * FROM order_items WHERE order_items.order_id IN (1,2,3,4...);
Ve sonra laravel birleşiyor ikinci SQL sonuçlarını farklı olarak ilk SQL sonuçlarına göre yabancı anahtarın . Sonunda toplama sonuçları iade.
Kapanışta foreign_key olmadan sütunlar seçtiyseniz, ilişki sonucu boş olur:
Order::with(['orderItems' => function($query) {
// $query->sum('quantity');
$query->select('quantity'); // without `order_id`
}
])->get();
#=> result:
[{ id: 1,
code: '00001',
orderItems: [], // <== is empty
},{
id: 2,
code: '00002',
orderItems: [], // <== is empty
}...
}]
Has
modelin ilişkisinin boş olmadığı nesnesini döndürür .
Order::has('orderItems')->get();
Laravel bu kodu bir SQL olarak değiştirir:
select * from `orders` where exists (
select * from `order_items` where `order`.`id` = `order_item`.`order_id`
)
whereHas
ve sorgularınıza koşul orWhereHas
koyma yöntemleri . Bu yöntemler , bir ilişki kısıtlamasına özelleştirilmiş kısıtlamalar eklemenize izin verirwhere
has
.
Order::whereHas('orderItems', function($query) {
$query->where('status', 1);
})->get();
Laravel bu kodu bir SQL olarak değiştirir :
select * from `orders` where exists (
select *
from `order_items`
where `orders`.`id` = `order_items`.`order_id` and `status` = 1
)
with('relation')
döndü koleksiyonunda ilgili tablonun verilerini içerecektirhas('relation')
vewhereHas('relation')
olacak değil , ilgili tablonun verileri içerir. Her iki çağrı gerekebilir Yaniwith('relation')
yanı sırahas()
yawhereHas()
.