2016-12-09 5 views
3

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

  1. 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.

  2. Verwenden Sie Ihre Boot-Trait-Methode (bootHasTranslation), aber da habe ich nicht das konkrete Objekt load oder with 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?

+0

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

Antwort

0

Sie können eine Middleware für die angemeldete Benutzersprache erstellen.

public function handle($request, Closure $next) 
{ 

    if (!Auth::check()) { 
     return redirect('/')->with('Success','You have successfully logged out');  
    } 

    $user = \Auth::user(); 

    $language = $user->languages()->where('language_id', $user->language_id); 

    $request->attributes->add([ 
     'user_language' => $language 
    ]); 

    $next($request); 
} 

Sie können diese Daten nach Middleware erhalten wie

$request->attributes->get('user_language'); 
+0

Danke für deine Antwort, aber ich denke das ist die Antwort für eine andere Frage;) Ich habe bereits die Sprache des Benutzers in meinem Beispiel' $ user-> language_id'. Was ich will, ist, die Beziehung eifrig zu laden! – patriziotomato

Verwandte Themen