Měl jsem podobnou situaci a Rozsah dotazu
spolu s mou kontingenční tabulkou pro jeden až mnoho vztahů. V mé situaci má uživatel více skupin a potřebuji tato data načíst spolu s objektem uživatele bez dalšího dotazu nebo bez JOINů. Viz Query scope
a jeden k mnoha a mnoho k mnoha s pivotem na Laravel Doc.
Pokud chcete načíst data pomocí kontingenční tabulky, zde je příklad
Uživatelského modelu:
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');
}
}
Skupinový model:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
Ve výše uvedeném uživatelském modelu viz return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, kde user_groups je moje kontingenční tabulka, která definuje vztah mezi uživateli a skupinou. group_id
a user_id
jsou pole v kontingenční tabulce.
Nyní načítání dat (na řadiči) pomocí výše uvedené architektury:
User::where(.....)->detail()->first();
kde detail()
je můj rozsah definovaný v uživatelském modelu jako scopeDetail
. Poznámka:scope
musí být připojena předpona. To vám poskytne uživatele se všemi skupinami, do kterých uživatel patří v poli, takže kdykoli si prohlížíte svá data v JSON, můžete vidět strukturu správným způsobem.
Pomocí výše uvedené metody můj uživatel objekt má všechny skupiny, do kterých uživatel patří.
Navíc
Pokud váš uživatelský model (uživatelé) souvisí také s jinými modely, můžete je všechny zahrnout definováním rozsahu pro třídu modelu jako
............
//..............
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
}
........
........