2016-04-25 32 views
0

Betrachten Sie die folgende Tabellenstruktur:Eloquent Modell Beziehung für Zwischentabelle

user table 
id 
name 
lang_region_id 

lang_region table 
id 
lang_id 
region_id 

lang table 
id 
name 

region table 
id 
name 

ziemlich neu in dem Laravel Rahmen, sondern versucht, Setup Eloquent Modelle und Beziehungen zu einer vorhandenen Datenbank. Ich möchte die Beziehung zwischen meinem Benutzermodell und den Lang- und Regionsmodellen festlegen. Die Tabelle lang_region definiert, welche Kombinationen aus Sprache und Region verfügbar sind, und dann können wir jeden Benutzer mit einer gültigen Kombination verknüpfen.

Ich habe die Laravel-Dokumentation mehrmals durchgelesen, um den richtigen Beziehungstyp zu finden, aber es scheint, dass die Viele zu Viele und Viele Beziehungen sind nah, aber da unsere user.id nicht in der Zwischentabelle verwendet wird Ich habe vielleicht kein Glück.

Sorry für die Amateur-Frage, aber nur an Laravel und ORMs im Allgemeinen gewöhnen.

+0

Sie sollten eine Pivot-Tabelle verwenden. Dann funktioniert Eloquent großartig – Mojtaba

+0

Das war mein erster Gedanke, aber es sieht so aus, als ob die redegewandten Beziehungen mit Pivot-Tabellen darauf angewiesen sind, dass die IDs in der Pivot-Tabelle existieren und die Tabellen auf dieser Tabelle schwenken. Die lang_region-Tabelle ist meine Pivot-Tabelle, da sie lang_id und region_id enthält, aber das Problem, das ich lösen möchte, ist, dass meine Benutzertabelle nur einen Fremdschlüssel für eine lang_region-Zeile hat und ich für die angegebene lang_region Zugriff auf die lang habe Benutzer. – JamieA

+0

Sind Sie sicher, dass Ihre Datenbankstruktur durchdacht ist? erklären, warum die lang_region-Tabelle das Teil ist, muss darauf verwiesen werden? –

Antwort

0

Ich würde die lang_region Tabelle als eine Pivot-Tabelle und eine reguläre Tabelle mit einem eigenen Modell verwenden.

class LangRegion extends model 
{ 
    protected $table = 'lang_region'; 

    public function language() 
    { 
     return $this->belongsTo(Language::class, 'lang_id'); 
    } 

    public function region() 
    { 
     return $this->belongsTo(Region::class); 
    } 

    public function users() 
    { 
     return $this->hasMany(User::class); 
    } 
} 

class User extends model 
{ 
    protected $table = 'user'; 

    public function langRegion() 
    { 
     return $this->belongsTo(LangRegion::class); 
    } 
} 

class Language extends model 
{ 
    protected $table = 'lang'; 

    public function regions() 
    { 
     $this->belongsToMany(Region::class, 'lang_region', 'lang_id', 'region_id'); 
    } 

    public function users() 
    { 
     $this->hasManyThrough(User::class, LangRegion::class, 'lang_id', 'lang_region_id'); 
    } 
} 


class Region extends model 
{ 
    protected $table = 'region'; 

    public function languages() 
    { 
     $this->belongsToMany(Language::class, 'lang_region', 'region_id', 'lang_id'); 
    } 

    public function users() 
    { 
     $this->hasManyThrough(User::class, LangRegion::class, 'region_id', 'lang_region_id'); 
    } 
} 
0

Wenn ich verstehe, was Sie richtig wollen:

class User extends Model { 
    private function lang_region() { 
     return $this->hasOne(LangRegion::class) 
    } 

    public function lang() { 
     return $this->lang_region()->lang(); 
    } 

    public function region() { 
     return $this->lang_region()->region(); 
    } 
} 

class LangRegion extends Model { 
    public function lang() { 
     return $this->belongsTo(Lang::class); 
    } 

    public function region() { 
     return $this->belongsTo(Region::class); 
    } 
} 
Verwandte Themen