2017-05-16 3 views
2

Ich verstehe verwenden müssen, wenn/nicht get(); in Laravel zu verwenden, um 5.Wenn nicht oder sollte get() in Laravel 5

PHP Warnung: Fehlende Argument 1 für Illuminate \ Support \ Collection :: get ()

Google shows me answers zu ihrem Problem, aber niemand wirklich erklärt, wenn Sie es/nicht verwenden sollten.

Beispiel:

App\User::first()->timesheets->where('is_completed', true)->get(); // error 
App\Timesheet::where('is_completed', true)->get(); // no error 

Fix:

App\User::first()->timesheets()->where('is_completed', true)->get(); // no error 

Bemerkt die Zeiterfassungen() und nicht die Zeiterfassungen? Könnte ich bitte eine detaillierte Erklärung für das, was vor sich geht, haben?

Ich komme aus einem Ruby-Hintergrund und mein Code schlägt fehl, da ich nicht weiß, wann () zu verwenden oder nicht.

Antwort

5

Ich werde versuchen, dies so gut zu beschreiben, ich kann, diese () Notation nach einer Eigenschaft gibt eine Instanz eines Builders, lassen Sie uns über die Beziehungen ein Beispiel nehmen,

Angenommen, Sie haben ein User Modell, das eine hat man -zu-Beziehung mit Posts,

Wenn Sie es so tun:

$user = App\User::first(); 

$user->posts(); 

hier Dies wird eine Beziehungsinstanz zurück, weil Sie dieangehängt 210, wann sollten Sie die () anhängen? Sie sollten es tun, wenn Sie zum Beispiel an Kette andere Methoden auf sie wollen:

$user->posts()->where('some query here')->first(); 

Jetzt habe ich einen der ein Artikel, den ich wollte.

Und wenn ich sage, alle Beiträge benötigt Ich kann dies tun:

$user->posts; 

oder dieses

$user->posts()->latest()->get(); 
$user->posts()->all()->get(); 

So ist der Schlüssel, was hier ist, wann immer Sie wollen Kette Methoden auf eine beredte Abfrage verwenden die (), wenn Sie nur Datensätze abrufen oder Eigenschaften direkt auf diese Datensätze zugreifen möchten, dann tun Sie es wie folgt:

$user->posts->title; 
+0

Das macht mein Gehirn glücklich 'wann immer Sie möchten andere Methoden verketten – Sylar

3

Nun, ->timesheet gibt eine Sammlung zurück, wobei ->timesheet() einen Builder zurückgibt.
Auf einer Sammlung können Sie ->where() und ->get('fieldname'), aber keine ->get() verwenden.
Die Methode ->get() kann zwar für einen Builder verwendet werden, jedoch wird eine auf dem Builder basierende Sammlung zurückgegeben.

Hoffe, das hilft.

0

Wenn Sie ->timesheets verwenden, greifen Sie auf eine Variable zu, die ihren Wert zurückgibt (in diesem Fall eine Instanz von Collection).

Wenn Sie ->timesheets() verwenden, rufen Sie das auf, was der Variablen zugewiesen ist. In diesem Fall wird eine Instanz von Builder zurückgegeben.

während pascalvgemerts Antwort Ihr Problem in Bezug auf Laravel beantwortet, erklärt es nicht den Unterschied zwischen dem Zugriff auf oder dem Aufrufen einer Variablen.

0

Das ‚Problem‘ ist, dass Sie konfrontiert sind aufgrund der Funktion in der Lage zu query relations

Wenn eine Beziehung wie eine Eigenschaft Zugriff auf ->timesheets, die Abfrage in der Beziehung definiert ausgeführt wird und das Ergebnis (in Form von einem Collection) wird an Sie zurückgegeben.

Beim Zugriff wie eine Methode ->timesheets() wird der Abfrage-Generator anstelle der resultierenden Auflistung zurückgegeben, so dass Sie die Abfrage ändern können, wenn Sie möchten. Da es dann ein Builder Objekt ist, müssen Sie get() aufrufen, um das tatsächliche Ergebnis zu erhalten, das im ersten Fall nicht benötigt wird.

-1

In einfachen Begriff

$user = App\User::get(); 

wird verwendet, um mehrere Daten aus der Datenbank zu holen

eher

$user = App\User::first(); 

wird verwendet, um zu holen einzelne Datensatz aus der Datenbank

+0

Ihre Frage war über den Unterschied zwischen '-> timesheets()' und '-> timesheets', nicht' first () 'und' get() '- sie scheinen das zu verstehen. – samiles