Znalazłem pojęcie i znaczenie za tych metod, aby być trochę mylące, to jest możliwe, aby ktoś mi wyjaśnić, jaka jest różnica między has
i with
jest w tym kontekście przykład (jeśli to możliwe)?
źródło
Znalazłem pojęcie i znaczenie za tych metod, aby być trochę mylące, to jest możliwe, aby ktoś mi wyjaśnić, jaka jest różnica między has
i with
jest w tym kontekście przykład (jeśli to możliwe)?
with()
jest do chętnego ładowania . Zasadniczo oznacza to, że zgodnie z głównym modelem Laravel wstępnie załaduje określone relacje. Jest to szczególnie przydatne, jeśli masz kolekcję modeli i chcesz załadować relację dla wszystkich z nich. Ponieważ przy chętnym ładowaniu 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
}
has()
jest filtrowanie wybranego modelu na podstawie relacji. Więc działa bardzo podobnie do normalnego GDZIE. Jeśli po prostu użyjesz has('relation')
, oznacza to, że chcesz tylko uzyskać 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()
działa w zasadzie tak samo, 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
with('relation')
będzie zawierać dane tabeli pokrewnej w zwróconej kolekcjihas('relation')
i niewhereHas('relation')
będzie zawierał danych tabeli pokrewnej. Więc może trzeba zadzwonić zarówno jak i .with('relation')
has()
whereHas()
whereHas
relacji z użytkownikami podczas wysyłania zapytań.whereHas
tego,use Illuminate\Database\Eloquent\Builder;
co wtedy jestfunction(Builder $query)
. Większość przykładów, które widziałem, używa kropkiBuilder
, wystarczy podać zapytanie $, która jest właściwa metoda?Dokument wyjaśnił już użycie. Więc używam SQL do wyjaśnienia tych metod
Przykład:
Zakładając, że jest
Order (orders)
wieleOrderItem (order_items)
.I już zbudowałeś relacje między nimi.
Te trzy metody opierają się na relacji .
Z
Wynik:
with()
zwróć obiekt modelu i powiązane wyniki.Zaleta: jest chętna do ładowania, która może zapobiec problemowi N + 1 .
Gdy używasz następującego Eloquent Buildera:
Laravel zmienia ten kod na tylko dwa SQL :
Następnie laravel scala wyniki drugiego SQL jako różne od wyników pierwszego SQL według klucza obcego . W końcu zwróć wyniki kolekcji.
Więc jeśli wybierzesz kolumny bez klucza obcego w zamknięciu, wynik relacji będzie pusty:
Ma
Has
zwróci obiekt modelu, że jego związek nie jest pusty .Laravel zmień ten kod na jeden SQL :
whereHas
whereHas
iorWhereHas
metody ustalaniawhere
warunków dla twoichhas
zapytań. Te metody pozwalają dodawać niestandardowe wiązania do ograniczenia relacji .Laravel zmień ten kod na jeden SQL :
źródło