2016-06-16 9 views
1

Ich habe folgendes Problem:Laravel 5.2 Drei-Wege-Schwenk mit benutzerdefinierten Dreh Modell

Ich habe drei Tabellen:

contacts (people) 
departments 
contact_types (e.g. IT-Contact) 

Alle von ihnen sind viele-zu-viele-Typen; Eine Person kann für 0-n-Abteilungen als 0-n Contact_types verantwortlich sein (sogar für dieselbe Abteilung wie mehrere Typen). Und so weiter.

Darüber hinaus muss ich eine Geschichte über das ganze Projekt haben, so dass jede der Tabellen auch "valid_start" und "valid_end" Zeitstempel speichert. Ich habe

Deshalb jetzt diese Beziehung Tabelle:

contact_contact_type_department 
    id 
    contact_id 
    contact_type_id 
    department_id 
    valid_start 
    valid_end 

Was ich tun am Ende ist ein Modell für die Zwischentabelle zu erstellen:

class DepartmentResponsible extends Model { 

protected $table = 'contact_contact_type_department'; 

protected $fillable = [...]; 

protected $dates = [ 
    'valid_start', 
    'valid_end', 
]; 

protected static function boot(){ 
    parent::boot(); 
    static::addGlobalScope(new ValidScope()); 
} 

public function contact() { 
    return $this->belongsTo('cap\Contact'); 
} 

public function department() { 
    return $this->belongsTo('cap\Department'); 
} 

public function type() { 
    return $this->belongsTo('cap\ContactType'); 
} 
} 

Kontakt Modell:

class Contact extends CustomModel{ 
protected $dates = [...]; 

protected $fillable = [...]; 

protected static function boot(){ 
    parent::boot(); 
    static::addGlobalScope(new ValidScope()); 
} 

public function departmentResponsibles() { 
    return $this->hasMany('cap\DepartmentResponsible'); 
} 
} 

Kontakttyp Modell:

class ContactType extends CustomModel { 
protected $dates = [...]; 

protected $fillable = [...]; 

protected static function boot() { 
    parent::boot(); 
    static::addGlobalScope(new ValidScope()); 
} 

public function responsible() { 
    return $this->hasMany('cap\DepartmentResponsible'); 
} 
} 

Abteilung Model: Ich gehe davon aus ich es muß Pivot-Tabelle

class Department extends CustomModel { 
protected $fillable = [...]; 

protected $dates = [...]; 

protected static function boot(){ 
    parent::boot(); 
    static::addGlobalScope(new ValidScope()); 
} 

public function responsibles(){ 
return $this->hasMany('cap\DepartmentResponsible'); 
} 

//other methods down here, which have no immpact on this issue 
} 

kann ich jetzt Dinge wie

Department::first()->responsibles 

In Bezug auf die Frage mit dem Zeitstempel auf der Pivot-Tabelle einer benutzerdefinierten machen wieder (hatte das schon einmal zu tun, in einem anderen Fall, wo ich einen "normalen" 2-Wege-Pivot-Tisch hatte)

Also meine 2 Fragen sind jetzt:

1. Ist das überhaupt der richtige Weg? Ich meine das Ganze mit dem Zwischenmodell und so weiter. Ich versuchte auch andere Möglichkeiten, aber ich konnte nichts wie department->attach(contact) zu arbeiten, da ich immer die dritte ID auch brauchen ...

2. Wie kann ich etwas wie Department :: first() - > Kontakte zur Arbeit? (In gewisser Weise, wo ich auf die Zwischen "verantwortlichen (= contact_contact_type_department)" -Tabelle zugreifen und Filter basierend auf den Gültigkeitsdaten; zB mit einem Bereich oder mit wherepivot Funktionen)

Antwort

0

Nun, ich ging schließlich mit dem Ansatz, dass Ich habe ein Zwischenmodell namens verantwortlich. Wenn ich zum Beispiel alle Kontakte und ihre Kontakttypen für eine Abteilung drucken möchte, kann ich Folgendes tun:

$department = Department::first(); 

<ul> 
    foreach($department->responsible as $responsible){ 
     <li>{{$responsible->contact->name}} as {{$responsible->type->name}}</li> 
    } 
</ul>