J'ai eu une situation similaire et j'ai Portée de la requête
avec mon tableau croisé dynamique pour une relation un à plusieurs. Dans ma situation, l'utilisateur a plusieurs groupes et j'ai besoin de récupérer ces données avec l'objet utilisateur sans requête supplémentaire ou sans JOINs.Voir Query scope
et un à plusieurs et plusieurs à plusieurs avec pivot sur Laravel Doc.
Si vous souhaitez récupérer des données à l'aide d'un tableau croisé dynamique, voici l'exemple
Modèle utilisateur :
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');
}
}
Modèle de groupe :
class Group extends Model
{
protected $fillable = [
'dn', 'cn', 'description',
];
}
Dans le modèle utilisateur ci-dessus, voir return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');
, où user_groups est mon tableau croisé dynamique qui définit la relation entre les utilisateurs et le groupe. group_id
et user_id
sont les champs du tableau croisé dynamique.
Récupération des données (sur le contrôleur) en utilisant l'architecture ci-dessus :
User::where(.....)->detail()->first();
où detail()
est ma portée définie dans le modèle utilisateur comme scopeDetail
. Remarque :scope
préfixe doit être joint. Cela vous donnera l'utilisateur avec tous les groupes auxquels l'utilisateur appartient dans le tableau, donc chaque fois que vous affichez vos données dans JSON, vous pouvez voir la structure de manière appropriée.
En utilisant la méthode ci-dessus, mon utilisateur l'objet contient tous les groupes auxquels l'utilisateur appartient.
Extra
Si votre modèle d'utilisateur (utilisateurs) est également lié à d'autres modèles, vous pouvez inclure tous ceux-ci en définissant la portée sur la classe de modèle comme
............
//..............
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
}
........
........