2015-07-21 8 views
5

Ich möchte alle Modelle abrufen, die keine Beziehung haben.Erhalte alle eloquenten Modelle ohne Beziehung

ähnliche Modelle zu holen, die man haben:

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

Ich würde im Grunde wie die Inverse dieses haben. Ich kann jedoch keine Dokumentation dafür finden.

Grundsätzlich ist diese Abfrage:

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

Aber ich möchte zu vermeiden, den Abfrage-Generator (DB::table('custom_design_requests')->rightJoin('quotes', 'quotes.custom_design_request_id', '=', 'custom_design_requests.id')->get();), zu verwenden, so dass ich eine Sammlung von Instanzen des Modells habe.

Dank

Antwort

9

Sie können so etwas wie dies versuchen:

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

Danke! Das hat den Trick gemacht, sollte das aber haben. :) –

+0

Während die has() -Methode sehr einfach zu verwenden scheint, sollten Sie bedenken, was Eloquent intern macht, wenn Sie es anrufen. Die resultierende Abfrage führt einen Subselect für jeden Datensatz in Ihrer Datenbank aus, der möglicherweise nicht effizient ist, wenn Sie viele Daten haben. In dem obigen Fall wäre das resultierende SQL etwa wie folgt: SELECT * FROM-Modelle WHERE (SELECT COUNT (*) FROM zitiert WHERE model_id = models.id) <1 " –

1

Versuchen:

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(); 

Dies wird LEFT JOIN Ihr Modell mit Zitaten und nehmen nur diejenigen, für die es keine entsprechenden Zitate.

+1

Danke, das funktioniert auch. Ich bevorzuge die 'has ('quote', '<', 1)' Methode. :) –

+1

Cool, ich wusste nicht, dass du es so machen kannst, ich denke ich habe heute auch etwas Neues gelernt :) –

Verwandte Themen