Ich stelle eine HasTranslation
-Trait für eines meiner eloquenten Modelle. Alle Modelle dieses Merkmal verwenden, werden eine Eins-zu-viele-Beziehung wie diese erhalten (wo man mein grundlegendes Modell zu ModelLanguages Beziehungen sehen):Immer eifrig Last Beziehung bei der Verwendung eines Merkmals in redegewandten Modell
public function languages()
{
return $this->hasMany(get_class($this).'Lang', 'master_id', 'id');
}
Was ich tun möchte, ist:
Immer eifrig laden Sie eine "hasOne" -Beziehung mit der Übersetzung der aktuellen Benutzersprache. Also, wann immer der Benutzer angemeldet ist, sollten meine Modelle etwas wie $model->userLanguage
eifrig geladen haben und vom Typ ModelLang
sein.
Dies sieht wie folgt aus und funktioniert gut:
public function userLanguage()
{
$user = \Auth::user();
if (!$user)
{
throw new \Exception(__CLASS__.': userLanguage not available because there is no session');
}
return $this->hasOne(get_class($this).'Lang', 'master_id', 'id')->where('language_id', $user->language_id);
}
ich mit der Möglichkeit bin zu kämpfen automatisch (eifrig) für alle Modelle diese Beziehungen laden, indem Sie gerade diese Eigenschaft enthält.
Was ich versucht hat bisher
einen Konstruktor in der Eigenschaft verwendet: Kann funktionieren, aber keine gute Idee, weil diese mit anderem Merkmale des contructor kollidieren kann. Grundsätzlich würde ich die Aussage bestätigen: Benutze den Konstruktor nicht in irgendeinem Merkmal.
Verwenden Sie Ihre Boot-Trait-Methode (
bootHasTranslation
), aber da habe ich nicht das konkrete Objektload
oderwith
Methode aufzurufen. Ich habe keinen Haken in die instanziiert eloquent Modell finden, wo ich meine Beziehung zu eifrig Last
Irgendwelche Ideen hinzufügen? Gibt es etwas Offensichtliches, das ich hier übersehen habe?
Sie könnten einen [global Umfang] erstellen (https://laravel.com/docs/5.3/eloquent#global-scopes) in Ihrem Merkmal, das immer ein '-> mit ('userLanguage') anwendet. – Neat