2017-04-03 4 views
0

Ich habe in den letzten Tagen mit einem Problem gekämpft. Ich habe gerade begonnen, Laravel zu benutzen und werde die Eloquent-Syntax wirklich gern hören! Aber es gibt ein Problem, wenn ich versuche, die richtige Beziehung zwischen drei Modellen zu bekommen.Laravel viele zu viele mit 3 Modellen

Ich habe dieses Setup bekam:

Programme Tabelle enthält

  • event_id
  • ROLE_ID
  • user_id

In meinem Ereignis-Modell, das ich

haben
public function programs(){ 
    return $this->hasMany(Program::class); 
} 

In meinem Benutzer Modell habe ich

bekam
public function programs(){ 
    return $this->hasMany(Program::class); 
} 

In meinem Rollenmodell muss ich

public function programs(){ 
    return $this->hasMany(Program::class); 
} 

Und mein Programm-Modell enthält

public function event(){ 
    return $this->belongsTo(Event::class); 
} 
public function user(){ 
    return $this->belongsTo(User::class); 
} 
public function role(){ 
    return $this->belongsTo(Role::class); 
} 

Und ich müssen das folgende Ergebnis erhalten

Events -> Users -> Role 

In meinem Controller habe ich $ events = Event :: mit ('programme.role.programs.user') -> get();

Welche dies produziert:

{ 
"id": 2, 
"name": "Concert: Freddy Kalas", 
"description": "Freddy Kalas konsert", 
"user_id": 2, 
"time_from": "12.04.2017 22:00:00", 
"time_to": "12.04.2017 23:00:00", 
"created_at": "2017-03-20 18:28:44", 
"updated_at": "2017-03-20 18:28:44", 
"programs": [ 
    { 
     "id": 2, 
    "event_id": 2, 
    "user_id": 2, 
    "role_id": 1, 
    "created_at": null, 
    "updated_at": null, 
    "role": { 
     "id": 1, 
     "name": "Camera operator", 
     "description": "Operates ordinary cameras or PTZ cameras", 
     "created_at": "2017-03-20 20:11:06", 
     "updated_at": "2017-03-20 20:11:06", 
     "programs": [ 
     { 
      "id": 1, 
      "event_id": 3, 
      "user_id": 2, 
      "role_id": 1, 
      "created_at": null, 
      "updated_at": null, 
      "user": { 
      "id": 2, 
      "name": "Dummy Dum", 
      "email": "[email protected]", 
      "created_at": "2017-03-20 16:45:09", 
      "updated_at": "2017-03-20 16:45:09" 
      } 
     }, 
     { 
      "id": 2, 
      "event_id": 2, 
      "user_id": 2, 
      "role_id": 1, 
      "created_at": null, 
      "updated_at": null, 
      "user": { 
      "id": 2, 
      "name": "Dummy Dum", 
      "email": "[email protected]", 
      "created_at": "2017-03-20 16:45:09", 
      "updated_at": "2017-03-20 16:45:09" 
      } 
     } 
     ] 
    } 
    } 
] 
}, 
{ 
    "id": 3, 
"name": "Prøveproduksjon", 
"description": "Prøveproduksjon med video og lyd", 
"user_id": 1, 
"time_from": "11.04.2017 13:00:00", 
"time_to": "11.04.2017 17:00:00", 
"created_at": "2017-04-03 17:12:37", 
"updated_at": "2017-04-03 17:12:37", 
"programs": [ 
    { 
     "id": 1, 
    "event_id": 3, 
    "user_id": 2, 
    "role_id": 1, 
    "created_at": null, 
    "updated_at": null, 
    "role": { 
     "id": 1, 
     "name": "Camera operator", 
     "description": "Operates ordinary cameras or PTZ cameras", 
     "created_at": "2017-03-20 20:11:06", 
     "updated_at": "2017-03-20 20:11:06", 
     "programs": [ 
     { 
      "id": 1, 
      "event_id": 3, 
      "user_id": 2, 
      "role_id": 1, 
      "created_at": null, 
      "updated_at": null, 
      "user": { 
      "id": 2, 
      "name": "Dummy Dum", 
      "email": "[email protected]", 
      "created_at": "2017-03-20 16:45:09", 
      "updated_at": "2017-03-20 16:45:09" 
      } 
     }, 
     { 
      "id": 2, 
      "event_id": 2, 
      "user_id": 2, 
      "role_id": 1, 
      "created_at": null, 
      "updated_at": null, 
      "user": { 
      "id": 2, 
      "name": "Dummy Dum", 
      "email": "[email protected]", 
      "created_at": "2017-03-20 16:45:09", 
      "updated_at": "2017-03-20 16:45:09" 
      } 
     } 
     ] 
    } 
    } 
] 
} 

Ich kann nicht die Modelle zu einander in Beziehung bekommen - es scheint. Das bevorzugte Ergebnis, das ich möchte, ist, dass alle Ereignisse mit vielen Benutzern verbunden sind - und alle Benutzer für dieses Ereignis an eine Rolle gebunden sind. Wie kann ich das mit Laravel und Eloquent erreichen?

Vielen Dank für Ihre Antworten!

EDIT: die Daten holen i den folgenden Code verwenden, um die Ergebnisse über

$events = Event::with('programs.role.programs.user')->get(); 

Inhalt der Programme Tabelle

# id, event_id, user_id, role_id, created_at, updated_at 
'1', '3', '2', '1', NULL, NULL 
'2', '2', '2', '1', NULL, NULL 

Dies würde bedeuten, zu erzeugen, dass der Benutzer mit der ID 2 ist nur Ereignis 3 mit einer Rolle von 1 und Ereignis 2 mit einer Rolle von 1 zugeordnet. Wie Sie aus den Ergebnissen sehen können, hat beide Ereignisse Rolle 1 und 2. Sorry für schlechte Erklärung ..

+0

Ihre Beziehungen sieht gut aus. Es ist wahrscheinlich nur die Art, wie du versuchst, die Daten zu bekommen, die nicht gut sind. Können Sie den Teil posten, der in Ihrem Code nicht funktioniert? – ettdro

+0

Sorry @ettdro - sollte das im ursprünglichen Beitrag enthalten haben. Bitte sehen Sie sich die aktualisierte Frage an. –

+0

Ist das nicht, was du da hast? Ich bin mir nicht sicher, wirklich zu verstehen, was Sie wollen? Wenn wir sehen, was Ihr $ Event zurückgibt, haben Sie ein Event mit 2 Benutzern und einer Rolle, die ihnen zugeordnet ist. – ettdro

Antwort

1

Wahrscheinlich versuchen Sie einfach, es einzeln zu machen und herauszufinden, was zurückgegeben wird.

@Fredrik Angell Moe gesagt:

Verstanden arbeitet nun unter Verwendung:

$events = Event::with('programs.role')->with('programs.user')->get();

+1

Ist Ihnen klar, dass Sie dies tun können: '$ events = Event :: with ('programme.role', 'programs.user') -> get();' – fubar

+0

@Fredrik Angell Moe überprüfen Sie dies auf saubereren Code ! – ettdro

+0

Bereits getan :) bemerkt, jetzt behoben. –

0

Benutzer mit der ID 2 nur mit Ereignis 3 mit einer Rolle von 1 zugeordnet ist und Ereignis 2 mit einer Rolle von 1. Wie Sie aus den Ergebnissen sehen können, hat sowohl Ereignisse die Rolle 1 und 2.

Sie verwenden zwei Werte. Einer ist die ID des Benutzers und der zweite ist die ID des Ereignisses.

Laravel kann real zwischen nur zwei Modellen definieren. Das heißt in Ihrer Anfrage verwenden Sie die programe_id und event_id.

Aber User_id vernachlässigt zu werden. Es wird also nur der Benutzer hinzugefügt, der sich auf das Modell bezieht, anstatt mit der Benutzer-ID zu filtern.

Der beste Weg, um dieses Problem zu lösen, ist stattdessen die Beziehung geht für die Raw-Abfrage verwenden, wo Sie brauchen Beziehung zwischen mehr als zwei Modellen zu bekommen.