2017-12-18 14 views
2

Ich bin ein Antwort Modell erstellen und dann versuchen, das Objekt zurückzugeben, damit Besitzer sind Beziehung. Hier ist der Code, der ein leeres Objekt zurückgibt:Laravel eifrig Laden mit (mit) vs Last() nach dem Muttermodell

//file: Thread.php 
//this returns an empty object !!?? 
public function addReply($reply) 
{ 
    $new_reply = $this->replies()->create($reply); 
    return $new_reply->with('owner'); 
} 

Allerdings, wenn ich die mit() Methode für Last swap() Methode der Besitzer Beziehung zu laden, bekomme ich das erwartete Ergebnis. Das ist die Antwort Objekt wird mit ihm zurückgegeben Besitzer Beziehung verknüpft ist:

//this works 
{ 
    $new_reply = $this->replies()->create($reply); 
    return $new_reply->load('owner'); 
} 

Ich verstehe nicht, warum. Auf der Suche nach Erklärungen.

Danke, Yeasir

+1

https://stackoverflow.com/questions/26005994/laravel-with-method-versus-load-method Hier haben Sie eine schöne Details Ihres Problems – Sohel0415

Antwort

2

Dies liegt daran, Sie with verwenden sollten, wenn Sie nicht über Objekt noch (Sie machen Abfrage), und wenn Sie bereits ein Objekt haben, sollten Sie load verwenden.

Beispiele:

Sammlung von Benutzern:

$users = User::with('profile')->get(); 

oder:

$users = User::all(); 
$users->load('profile'); 

Einzelplatz:

$user = User::with('profile')->where('email','[email protected]')->first(); 

oder

$user = User::where('email','[email protected]')->first(); 
$user->load('profile'); 

Methoden Umsetzung in Laravel

Sie können auch bei with Methode Implementierung aussehen:

public static function with($relations) 
{ 
    return (new static)->newQuery()->with(
     is_string($relations) ? func_get_args() : $relations 
    ); 
} 

so wird es neue Abfrage starten, um in der Tat wird es nicht ausführen Abfrage, bis Sie get, first usw. verwenden, wo load Implementierung ist wie folgt:

public function load($relations) 
{ 
    $query = $this->newQuery()->with(
     is_string($relations) ? func_get_args() : $relations 
    ); 

    $query->eagerLoadRelations([$this]); 

    return $this; 
} 

also gibt es das gleiche Objekt zurück, aber es lädt die Beziehung für dieses Objekt.

+0

ausgezeichnet. Die Funktionsdefinitionen machten es klar. Um das gleiche Ergebnis wie die Funktion ** load ** zu erreichen, muss man folgendes tun: 'return $ new_reply-> mit ('owner') -> latest() -> first()'. Wichtig ist hier zu verstehen, dass ein bereits existierendes Objekt tatsächlich ein Abfrage-Generator ist, mit dem Sie weitere Verkettungen durchführen können. Vielen Dank für die Klärung. –

Verwandte Themen