2016-07-22 4 views
1

Im folgenden Code gibt $ request-> input ('id') eine ganze Zahl zurück. Ich kann genau das zurückgeben und es jedes Mal sehen. Oder setze es auf eine Variable und gib es zurück, um es jedes Mal zu sehen. Wenn ich die $ request-> input ('id') in meinem Code durch genau diesen Integer-Wert ersetze, bekomme ich, was ich suche, aber wenn ich eine Variable belasse, gibt sie immer eine leere Menge zurück. Was ist los? Ich bin so verwirrt!Laravel Eloquentes Modell, das leere Mengen mit einer Variablen in where-Klausel zurückgibt

public function delete($id, Request $request) 
{ 
    $community = Community::find($id); 

    return $community->categories->where('id', $request->input('id'))->first(); 
} 

Antwort

1

Wenn Sie das tun $community->categories->where(... Sie auf ein Collection-Objekt die where Methode aufrufen, die das Ergebnis der Beziehung Abfrage. Sie führen sowohl where als auch first mit allen verwandten Kategorien im Speicher aus, nachdem Sie sie aus der Datenbank abgerufen haben.

Wenn Sie $community->categories()->where(... getan haben, rufen Sie die where Methode für ein Relation-Objekt auf (das selbst einen Builder enthält). In diesem Fall wird die Abfrage nicht ausgelöst, bis Sie die letzte Methode first (und am häufigsten get) ausführen, und auch die where Filterung durch das DBMS erfolgt, Ihre Anwendung erhält nur die passenden Kategorien. Dies kann effizienter sein.

Also, auf den Punkt Ihrer Frage:

Sie werden feststellen, dass die Unterschrift des Collection::where Verfahren einen dritten Parameter aufweist, ist, ob der Vergleich streng, die standardmäßig auf true. Meine Vermutung ist, dass die Anfrage-Eingabe als eine Zeichenkette kommt und nicht streng mit der ID übereinstimmt, die als Int geworfen wird.

Inzwischen hat die Builder::where Methode keinen strengen Vergleich (wieder, es ist nicht PHP, die es ausführen). Du hast also keine Sorgen. 1

Option:

return $community->categories->whereLoose('id', $request->input('id'))->first(); 

Option 2 (besser, meiner Meinung nach):

return $community->categories()->where('id', $request->input('id'))->first(); 
+1

Das war eine erstaunliche Antwort, und vielen Dank! Nicht nur die Lösung, sondern der ganze Grund dahinter. Sehr geschätzt! – aylnon

Verwandte Themen