2015-06-04 11 views
7

Mam trzy modele, które muszą być powiązane w tabeli przestawnej: użytkownik, uczeń, plan. Tak więc każdy użytkownik może zapisać ucznia do planu.Trójstronna relacja wiele-wiele w Laravel

Co znalazłem tak daleko jest stworzenie pivot dla dwóch modeli, powiedzmy Użytkownika oraz plan i przymocować student_id jako dodatkowe pola:

$user->plans()->attach([1 => ['student_id' => $student_id]); 

Jednym z problemów jest to, że jeśli staram się odzyskać plany dla konkretnego użytkownika, nie pojawia się model studencki, tylko identyfikator, więc:

return $this->BelongsToMany('App\Plan', 'plans_students_users', 'user_id', 'plan_id') 
->withPivot('student_id'); 

więc musiałbym zrobić drugą kwerendę, aby uzyskać model studencki.

Czy jest jakiś inny sposób się do tego zabrać, zważywszy, że będę chciał dokonać kwerendy we wszystkich kierunkach, np:

$user->plans() (attaching the students) 
$student->plans() (attaching the user) 
$plan->users() (attaching the students) 
$plan->students() (attaching the users) 

Odpowiedz

9

często używam inny model abstrakcyjny trójdrożny wiele do wielu relacje.

Mamy naszą relację, którą nazwiemy relacją relation.

db struktura:

table relations: id, user_id, student_id, plan_id 

Aplikacja ma następujące cztery modele:

  • Użytkownika
  • Student
  • Plan
  • Relacja

Oto, w jaki sposób połączyć się z czterech modeli z wykorzystaniem zależności:

użytkownika, plan, student:

function relations() { 
    return $this->hasMany(Relation::class); 
} 

Powiązania:

function student() { 
    return $this->belongsToMany(Student::class); 
} 

function user() { 
    return $this->belongsToMany(User::class); 
} 

function plan() { 
    return $this->belongsToMany(Plan::class); 
} 

Można pobierać podmioty, takie jak to:

//get the plan of a student related to the user 
$user->relations()->where('student_id', $student)->first()->plan(); 

//get all entities from the relation 
foreach ($user->relations as $relation) { 
    $plan = $relation->plan; 
    $student = $relation->student; 
} 

Jest to jedyne rozwiązanie, jakie znalazłem przez cały czas, kiedy pracowałem nad Laravel.

+0

Świetna odpowiedź Carlos. –

+0

Nie można używać metod attach() i detach() w ten sposób. – Mesuti

+3

W modelu relacji, dlaczego jest toToMany? czy nie powinno to należeć? W ten sposób każda relacja ma JEDNEGO studenta, JEDNEGO użytkownika i JEDEN plan, prawda? – Adocad