Ich hatte eine ähnliche Situation und ich habe Scope Query
zusammen mit meiner Pivot-Tabelle für eine zu vielen Beziehung. In meiner Situation hat der Benutzer mehrere Gruppen und ich muss diese Daten zusammen mit dem Benutzerobjekt ohne zusätzliche Abfrage oder ohne JOINs abrufen. Siehe Query scope
und eins zu vielen und viele zu vielen mit Pivot auf Laravel Doc.
Wenn Sie Daten mithilfe einer Pivot-Tabelle abrufen möchten, finden Sie hier das Beispiel
Benutzermodell:
class User extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name', 'email', 'username', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
public function groups()
{
return $this->belongsToMany('App\Group', 'user_groups',
'user_id', 'group_id');
}
public function scopeDetail($query)
{
return $query->with('groups');
}
}
Gruppenmodell:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
Siehe im obigen Benutzermodell return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, wobei user_groups meine Pivot-Tabelle ist, die die Beziehung zwischen Benutzern und Gruppe definiert. group_id
und user_id
sind die Felder in der Pivot-Tabelle.
Jetzt werden Daten (auf dem Controller) mit der obigen Architektur abgerufen:
User::where(.....)->detail()->first();
wobei detail()
ist mein Bereich, der im Benutzermodell als scopeDetail
definiert ist . Hinweis:scope
Präfix muss angehängt werden. Dadurch erhalten Sie den Benutzer mit allen Gruppen, denen der Benutzer im Array angehört, sodass Sie die Struktur immer dann richtig sehen können, wenn Sie Ihre Daten in JSON anzeigen.
Mit obiger Methode, mein Benutzer Objekt enthält alle Gruppen, denen der Benutzer angehört.
Extra
Wenn sich Ihr Benutzermodell (Benutzer) auch auf andere Modelle bezieht, können Sie all diese einbeziehen, indem Sie den Bereich für die Modellklasse als
............
//..............
public function profile()
{
return $this->belongsToMany('App\Profile', 'user_id');
}
public function data1()
{
return $this->belongsToMany('App\Data1', 'user_id');
}
public function groups()
{
return $this->belongsToMany('App\Group', 'user_groups',
'user_id', 'group_id');
}
//Defining query scope................
public function scopeDetail($query)
{
return $query->with('groups','profile','data1');
//to fetch user with this scope use User::where(.....)->detail()->get(); notice there is not scope prefix while using the scope
}
........
........