2016-04-16 17 views
1

Ich habe 2 Controller & Modelle:Modell Beziehung in Laravel

  1. Benutzer Controller: (Model Beziehung: $this->hasMany(Hero::Class);)

  2. Hero-Controller: Jeder Held seine eigenen Attribute hat, wie Name, Stärke und Leben. Modell Beziehung: ($this->belongsTo(User::class);)

Jeder Benutzer kann mehrere Helden besitzen.

das bedeutet, dass USER ID: 1 3 Helden haben können: HERO ID 5, 20, 26..

Meine Frage: Wie definieren Sie die Beziehungen so und machen Laravel weiß, wie mit meiner user_heroes Tabelle umzugehen? Die Beziehung ich spreche in der folgenden Abbildung beschrieben:

Despired relationship

Wie richte ich eine solche Art von Beziehung in meinem Laravel API?

+0

Sie meinen 'UserModel' und' HeroModel', nicht wahr? Eloquente Modelle haben Beziehungen, keine Controller. –

+0

Ja, das meine ich. – TheUnreal

+1

Es scheint mir, was Sie wollen, ist eine Eins-zu-viele-Beziehung, aber Ihre Datenbank spiegelt diese Beziehung nicht wider. Sie benötigen eine Pivot-Tabelle im Fall einer Viele-zu-Viele-Beziehung. Wenn Sie eine Eins-zu-viele-Beziehung haben möchten, brauchen Sie ein 'user_id'-Feld in Ihrer' held'-Tabelle, Sie brauchen keine Pivot-Tabelle. So erwartet Laravel, dass Sie Ihre Datenbank für diese Art von Beziehung einrichten. – Pavlin

Antwort

2

Wenn ein Benutzer viele Helden haben kann, und ein Held kann auch zu vielen Benutzern gehören, ist es eine viel zu viele Beziehung. In Laravel ist die Inverse einer Viele-zu-Viele-Beziehung auch eine Viele-zu-Viele-Beziehung, und sie werden beide beschrieben durch belongsToMany().

https://laravel.com/docs/5.2/eloquent-relationships#many-to-many

Also in Ihrem User-Modell:

public function heros() { 
    return $this->belongsToMany(Hero::class); 
} 

Und in Ihren Helden Modell:

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

Laravel wird die Verbindungstabelle übernehmen hero_user benannt ist, die zwei Modellnamen, Singular, in alphabetischer Reihenfolge. Wenn Sie verwenden möchten user_heroes wie Sie in Ihrem Bild haben, müssen Sie es an:

return $this->belongsToMany(Hero::class, 'user_heroes'); 

(in beiden Modellverfahren).

+0

Vielen Dank für Ihre Antwort. scheint, als hätte ich viele zu viele Beziehungen zu benutzen. Weißt du, was ist der Ausdruck, um in diesem Fall einen neuen Benutzerhelden zu erstellen (vorausgesetzt, der Benutzer hat sich angemeldet)? – TheUnreal

+0

Etwas wie '$ user-> heros() -> attach ($ hero_id)', wenn der Held bereits existiert. https://laravel.com/docs/5.2/eloquent-relationships#inserting-many-to-many-relationships –