Ho avuto una situazione simile e ho Ambito della query
insieme alla mia tabella pivot per una relazione uno a molti. Nella mia situazione, l'utente ha più gruppi e ho bisogno di recuperare quei dati insieme all'oggetto utente senza query aggiuntive o senza JOIN.Vedi Query scope
e uno a molti e molti a molti con perno su Laravel Doc.
Se desideri recuperare i dati utilizzando la tabella pivot, ecco l'esempio
Modello utente:
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');
}
}
Modello di gruppo:
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
Nel modello utente sopra, vedi return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, dove user_groups è la mia tabella pivot che definisce la relazione tra utenti e gruppo. group_id
e user_id
sono i campi nella tabella pivot.
Ora Recupero dei dati (sul controller) utilizzando l'architettura sopra:
User::where(.....)->detail()->first();
dove detail()
è il mio ambito definito in Modello utente come scopeDetail
. Nota:scope
il prefisso deve essere allegato. Questo ti darà l'utente con tutti i gruppi a cui appartiene l'utente nell'array, quindi ogni volta che visualizzi i tuoi dati in JSON puoi vedere la struttura nel modo corretto.
Utilizzando il metodo sopra, il mio utente l'oggetto ha tutti i gruppi a cui appartiene l'utente.
Extra
Se il tuo modello utente (utenti) è correlato anche ad altri modelli, puoi includerli tutti definendo l'ambito sulla classe del modello come
............
//..............
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
}
........
........