2015-07-21 8 views
5

Chciałbym pobrać wszystkie modele, które nie mają związku.Zdobądź wszystkie elokwentne modele bez związku

Podobny do pobierania modele, które mają jeden:

return $this->model->has('quote')->orderBy('created_at', 'desc')->get(); 

bym zasadzie lubią mieć odwrotność tego. Nie mogę znaleźć żadnej dokumentacji, aby to zrobić.

Zasadniczo to zapytanie:

SELECT * FROM custom_design_requests 
RIGHT JOIN quotes 
ON quotes.`custom_design_request_id` = `custom_design_requests`.id 

Ale chciałbym uniknąć konieczności korzystania z kwerend (DB::table('custom_design_requests')->rightJoin('quotes', 'quotes.custom_design_request_id', '=', 'custom_design_requests.id')->get();), tak że mam kolekcję wystąpień modelu.

Dzięki

Odpowiedz

9

Można spróbować czegoś takiego:

$this->model->has('quote', '<', 1)->orderBy('created_at', 'desc')->get(); 
+1

Dziękuję! To jednak wystarczyło. :) –

+0

Chociaż metoda has() wydaje się bardzo prosta w użyciu, powinieneś pamiętać o tym, co Eloquent robi wewnętrznie, gdy ją wywołujesz. Wynikowe zapytanie uruchomi podselekt dla każdego rekordu w bazie danych, który może nie być wydajny, jeśli masz dużo danych. W powyższym przypadku wynikowy kod SQL może wyglądać następująco: WYBIERZ * Z modeli WHERE (WYBIERZ COUNT (*) Z cudzysłowów WHERE model_id = models.id) <1 " –

1

Spróbuj:

return $this->model 
    ->leftJoin('quotes', 'quotes.custom_design_request_id', '=', 'custom_design_requests.id') 
    ->whereNull('quotes.custom_design_request_id') 
    ->orderBy('created_at', 'desc')->get(); 

Będzie LEFT JOIN model z cytatami i wziąć tylko te, dla których nie istnieją odpowiednie cytaty.

+1

Dziękuję, to działa również. Wolę metodę 'has ('quote', '<', 1)'. :) –

+1

Fajnie, nie wiedziałem, że możesz to zrobić, chyba też nauczyłem się dzisiaj czegoś nowego :) –

Powiązane problemy