2016-12-01 9 views
0

Vielen Dank für Ihre Zeit im Voraus. Springe zum fettgedruckten Teil, wenn du es eilig hast.Laravel 5.3 Eloquent Modell Dynamische Tabelle Eigenschaft

Ich habe einen folgenden Anwendungsfall: Jeder Benutzer der App verwendet seine eigene Reihe von Präfix-Tabellen für Eloquent-Modelle (z. B. Invoice.php für code_invoices und Client.php für code_clients). Die Präfixe sind in der Benutzertabelle definiert (z. B. users.code). In Laravel 5.2 konnte ich leicht die Eigenschaft $ table des Eloquent-Modells setzen, indem ich die Variable config (oder session) zur Laufzeit nach der Anmeldung des Benutzers lese. Alles funktionierte, einschließlich der Relationen.

Nach dem 5.3-Update gibt jedoch ein zur Laufzeit festgelegter Konfigurationswert jetzt null im Objekt zurück (wie auch der Sitzungswert). Ich weiß aus den Dokumenten, dass die Sitzung im Konstruktor jetzt nicht verfügbar ist, und die vorgeschlagene Problemumgehung ist die Middleware-Schließung, aber Eloquent-Klassen können die Middleware-Schließung nicht verwenden, da sie einen nicht definierten Methodenfehler zurückgibt.

Also meine Frage ist zweifach: Wie kann ich dynamisch die $ table -Eigenschaft des Eloquent setzen und/oder lese ich die Laufzeitkonfigurationswerte im Modell.

Jede Hilfe würde sehr geschätzt werden.

EDIT: Ich bin in der Lage, eine Tabelle für das Modell mit der from() Methode anzugeben. Dies funktioniert: $model = \App\ModelName::from('prefix_table')->first(); Aber mein wirkliches Problem ist Beziehungen. Dies funktioniert nicht: $model = \App\ModelName::from('prefix_table')->with('relatedModel')->first() nicht, weil das verwandte Modell nicht weiß, welche Tabelle Präfix verwendet werden soll.

Interessant, nicht wahr? :)

+0

Vielleicht könnte 'DB :: setTablePrefix ($ prefix)' in diesem Fall nützlich sein. – geoandri

Antwort

0

OK, so dass für alle anderen das gleiche Problem konfrontiert, das ist mein Problem umgehen, und ich glaube, es ist sauber eno igitt:

Im Login-Controller, anstatt zu versuchen, ein Runtime-Konfigurationsvariable oder einen Sitzungswert und gibt die nächste Anforderung zu sparen, habe ich mit Flash-Daten umgeleitet: return redirect()->intended('dashboard')->with('company_code', $user->company_code); (beachten Sie, dass insetad meines $ user- > company_code Sie können einstellen, was Sie benötigen, um an die Sitzung zu gehen. Dann im User's Model (User.php) habe ich nach diesen Flash-Daten gesucht und diese dauerhaft in der Sitzung gespeichert. Danach konnte ich diesen permanenten Schlüssel in all meinen Modellen bekommen. Ich habe das User-Modell verwendet, weil ich sicher bin, dass es vor jedem meiner anderen Modelle geladen wird, da es Teil der Auth-Middleware ist.

Ich denke, das Problem mit dem ursprünglichen Ansatz (Speichern von Sitzung oder Konfiguration in der Login-Methode) ist, dass das Modell geladen wird, bevor die Middleware ausgeführt wurde, so dass der Wert Null zurückgibt. Mit redirect()->with() fügen Sie einen weiteren Anforderungszyklus hinzu, und dann wird der Wert festgelegt, bevor das Modell geladen wird.

Ich hoffe, das hilft jemandem, da ich gerade zu Laravel 5.1 zurückkehren wollte, bevor ich darüber nachdachte.

0

ich so etwas wie dies für eine wirklich schrecklich Anwendungsfall:

/** 
* Override to allow different servers to use different tables 
* 
* @return string 
*/ 
public function getTable() 
{ 
    if (is_null($this->table)) { 
     if (str_contains(config('database.mysql.host'), 'SOMETHING_DIFFERENT')) { 
      $this->table = 'database1.sales_rank'; 
     } else { 
      $this->table = 'database2.sales_rank'; 
     } 
    } 
    return parent::getTable(); 
} 
+0

Während dies funktioniert, und es gibt eine bequemere Möglichkeit, dies mit '$ model = \ App \ ModelName :: von ('prefixed_table) -> first();' die Beziehungen funktionieren nicht, und das ist Mein wirkliches Problem. – quiq

+0

@quiq - echte Probleme gehören in die Frage und helfen dir, echte Antworten zu bekommen ;-) Und mein Ansatz funktioniert mit Beziehungen (5.1 hier), obwohl das Problem mit config() vielleicht durch Zugriff auf env() direkt gelöst werden kann, obwohl das ein ist etwas hässlich. Manchmal hässlich funktioniert, wenn es nicht funktioniert. – markdwhite

+0

In 5.1 konnte ich config ('app.value') zur Laufzeit im Eloquent-Modell gut eingestellt lesen. Es funktioniert jedoch nicht in 5.3. Es kann nicht in env sein, da ich es zur Laufzeit gesetzt habe, hat jeder Benutzer der App verschiedene vordefinierte Tabellen. Es ist nicht so viele Tische/Benutzer wie es sich anhört. – quiq

1

Zum Lesen von Config können Sie dies tun: $value = config('app.timezone'); documentation für mehr lesen

und $table setzen Sie tun cand dies im Modell:

protected $table = 'my_flights'; 
+0

Wie ich schon sagte, gibt config ('app.whateverSetOnRuntime') in einem Modell null zurück. Es scheint, dass Laufzeit-Konfigurationsvariablen zwischen den Anforderungen nicht bestehen bleiben. – quiq

+0

@quiq Wenn der Wert, den Sie beibehalten möchten, sich auf die Sitzung des Benutzers bezieht, sollte er dort gespeichert werden. Ist das in Ihrem Anwendungsfall machbar? – markdwhite

+0

Es war die Art und Weise, wie App vor 5.3 Update funktioniert hat. Der Benutzer meldet sich an, und ich speichere seinen Präfixcode in der Sitzung, dann hole ich ihn in das Modell und setze die $ table -Eigenschaft, und alles war Dandy. Session ('anyrunttimevalue') oder config ('anyrunttimevalue') gibt jetzt jedoch null im Modell zurück. Ich zögere, zu 5.2 zurückzukehren, da ich diese App für die Zukunft weiterentwickeln muss. – quiq

Verwandte Themen