2017-07-07 8 views
1

Betrachten Sie dieses BeispielWie funktionieren Laravel-Modellbeziehungen im Kern?

class SomeClass extends Model{ 
    public function user(){ 
     return $this->belongsTo('App\User'); 
    } 
} 
$instance = SomeClass::findOrFail(1); 
$user = $instance->user; 

wie tun Laravel Know (i in Kern bedeutet), dass $ instanz> Benutzer (ohne Klammern) rückkehrbezogene Modell?

+0

Sehr breit, aber kurz gesagt, es wird durch '__get()' Accessor von 'Model.php' aufgelöst. Überprüfen Sie den Quellcode. –

+0

Ja. Laravels Quellcode ist Open Source. Sie hätten sich das selbst anschauen können: https://github.com/laravel/framework/blob/5.4/src/Illuminate/Database/Eloquent/Model.php#L1260 –

+0

Seine Magie (Funktionen). – apokryfos

Antwort

4

Grundsätzlich, wenn Sie versuchen, eine Eigenschaft von einem Modell für den Zugriff auf die __getmagic method aufgerufen wird, und es ist so etwas wie die folgenden:

public function __get($key) 
{ 
    return $this->getAttribute($key); 
} 

Wie Sie das sehen können, die __get magische Methode ruft definiert einen anderen Benutzer Verfahren (getAttribute), die etwa wie folgt ist:

public function getAttribute($key) 
{ 
    if (! $key) { 
     return; 
    } 

    // If the attribute exists in the attribute array or has a "get" mutator we will 
    // get the attribute's value. Otherwise, we will proceed as if the developers 
    // are asking for a relationship's value. This covers both types of values. 
    if (array_key_exists($key, $this->attributes) || 
     $this->hasGetMutator($key)) { 
     return $this->getAttributeValue($key); 
    } 

    // Here we will determine if the model base class itself contains this given key 
    // since we do not want to treat any of those methods are relationships since 
    // they are all intended as helper methods and none of these are relations. 
    if (method_exists(self::class, $key)) { 
     return; 
    } 

    return $this->getRelationValue($key); 
} 

In diesem Fall (zum Bezug), die letzte Zeile für das Abrufen von return $this->getRelationValue($key); ist verantwortlich ein Verhältnis. Lesen Sie den Quellcode weiter, verfolgen Sie die einzelnen Funktionsaufrufe und Sie erhalten die Idee. Starten von Illuminate\Database\Eloquent\Model.php::__get Methode. Übrigens, dieser Code stammt aus der letzten Version von Laravel, aber letztlich ist der Prozess derselbe.

Kurze Zusammenfassung: Laravel zunächst überprüft, ob die Eigenschaft/$kay zugegriffen wird, ist eine Eigenschaft eines Modells oder wenn es eine Accessor-Methode im Modell definiert sich dann einfach zurückgibt, dass das Eigentum sonst hält es weitere Überprüfung und wenn Es wird eine Methode gefunden, die im Modell unter Verwendung dieses Namens definiert ist (Eigenschaft/$kay). Dann wird einfach die Beziehung zurückgegeben.

Verwandte Themen