Laravel-wymowne "ma", "Z", "gdzie" - co oznaczają?
Uznałem, że koncepcja i znaczenie tych metod są nieco mylące, czy jest możliwe, aby ktoś mi wyjaśnił, jaka jest różnica między has
i with
, w kontekście przykładu (jeśli to możliwe)?
1 answers
Z
with()
jest dla eager loading. Oznacza to, że w głównym modelu Laravel załaduje wstępnie określone relacje. Jest to szczególnie przydatne, jeśli masz kolekcję modeli i chcesz załadować relację dla wszystkich z nich. Ponieważ przy eager loading uruchamiasz tylko jedno dodatkowe zapytanie DB zamiast jednego dla każdego modelu w kolekcji.
Przykład:
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
}
MA
has()
jest filtrowanie wybór modelu na podstawie relacji. Działa więc bardzo podobnie do normalnego stanu gdzie. Jeśli użyjesz has('relation')
, oznacza to, że chcesz uzyskać tylko modele, które mają co najmniej jeden powiązany model w tej relacji.
Przykład:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
WhereHas
whereHas()
działa zasadniczo tak samo jak has()
, ale pozwala określić dodatkowe filtry dla powiązanego modelu do sprawdzenia.
Przykład:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 07:07:52