Miałem podobną sytuację i Zakres zapytania
wraz z moją tabelą przestawną dla relacji jeden do wielu. W mojej sytuacji użytkownik ma wiele grup i muszę pobrać te dane wraz z obiektem użytkownika bez dodatkowego zapytania lub bez JOIN. Zobacz Query scope
i jeden do wielu i wiele do wielu z przestawieniem na Laravel Doc.
Jeśli chcesz pobrać dane za pomocą tabeli przestawnej, oto przykład
Model użytkownika:
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');
}
}
Model grupy:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
W powyższym modelu użytkownika zobacz return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, gdzie user_groups to moja tabela przestawna, która definiuje relacje między użytkownikami a grupą. group_id
i user_id
są polami w tabeli przestawnej.
Teraz Pobieranie danych (na kontrolerze) przy użyciu powyższej architektury:
User::where(.....)->detail()->first();
gdzie detail()
czy mój zakres jest zdefiniowany w modelu użytkownika jako scopeDetail
? . Uwaga:scope
przedrostek musi być dołączony. To da ci użytkownika ze wszystkimi grupami, do których należy użytkownik w tablicy, więc za każdym razem, gdy przeglądasz swoje dane w JSON, możesz zobaczyć strukturę we właściwy sposób.
Używając powyższej metody, mój użytkownik obiekt posiada wszystkie grupy, do których należy użytkownik.
Dodatkowe
Jeśli Twój model użytkownika (użytkownicy) są również powiązane z innymi modelami, możesz uwzględnić je wszystkie, definiując zakres klasy 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
}
........
........