Имах подобна ситуация и Обхват на заявката
заедно с моята централна таблица за релация едно към много. В моята ситуация потребителят има множество групи и трябва да извлека тези данни заедно с потребителски обект без допълнителна заявка или без JOIN. Вижте Query scope
и един към много и много към много с опора на Laravel Doc.
Ако искате да извлечете данни с помощта на въртяща се таблица, ето примерния
Потребителски модел:
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');
}
}
Групов модел:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
В потребителския модел по-горе вижте return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, където user_groups е моята основна таблица, която дефинира връзката между потребители и група. group_id
и user_id
са полетата в обобщената таблица.
Сега се извличат данни (на контролера) с помощта на горната архитектура:
User::where(.....)->detail()->first();
където detail()
е моят обхват, дефиниран в потребителския модел като scopeDetail
. Забележка:scope
трябва да бъде приложен префикс. Това ще ви даде потребителя с всички групи, към които принадлежи потребителят в масива, така че всеки път, когато преглеждате данните си в JSON, можете да видите структурата по правилен начин.
Използвайки горния метод, моят потребител обектът има всички групи, към които принадлежи потребителят.
Допълнително
Ако вашият потребителски модел(потребители) също е свързан с други модели, тогава можете да включите всички тези, като дефинирате обхват в класа на модела като
............
//..............
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
}
........
........