Jeg havde en lignende situation, og jeg Forespørgselsomfang
sammen med min pivottabel for en til mange relation. I min situation har brugeren flere grupper, og jeg skal hente disse data sammen med brugerobjektet uden ekstra forespørgsel eller uden JOINs. Se Query scope
og én til mange og mange til mange med pivot på Laravel Doc.
Hvis du vil hente data ved hjælp af pivottabel, er her eksemplet
Brugermodel:
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');
}
}
Gruppemodel:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
I ovenstående brugermodel, se return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, hvor user_groups er min pivottabel, som definerer forholdet mellem brugere og gruppe. group_id
og user_id
er felterne i pivottabellen.
Henter nu data (på controller) ved hjælp af ovenstående arkitektur:
User::where(.....)->detail()->first();
hvor detail()
er mit omfang defineret i Brugermodel som scopeDetail
. Bemærk:scope
præfiks skal vedhæftes. Dette vil give dig brugeren med alle de grupper, som brugeren tilhører i array, så hver gang du ser dine data i JSON, kan du se strukturen på den rigtige måde.
Ved at bruge ovenstående metode, min bruger objektet har alle de grupper, som brugeren tilhører.
Ekstra
Hvis din brugermodel(brugere) også er relateret til andre modeller, kan du inkludere alle dem ved at definere omfanget på modelklassen som
............
//..............
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
}
........
........