J'ai essayé de créer un système de gestion des utilisateurs simple mais je continue de frapper des barrages routiers quand il s'agit d'interroger des relations. Par exemple, j'ai tilisateurs et rôles et chaque fois que j'essaie de faire une requête pour tous les utilisateurs et leurs rôles, j'obtiens une erreur. Celui du titre n'est que le dernier que j'ai rencontré.
Mes modèles d'utilisateur et de rôle ressemblent à ceci:
class Role extends Model
{
public function users()
{
$this->belongsToMany('\App\User', 'fk_role_user', 'role_id', 'user_id');
}
}
class User extends Model
{
public function roles()
{
$this->belongsToMany('\App\Role', 'fk_user_role', 'user_id', 'role_id');
}
}
Ma table de migration pour la relation plusieurs-à-plusieurs entre les deux ressemble à ceci:
public function up()
{
Schema::create('role_user', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->nullable(); //fk => users
$table->integer('role_id')->unsigned()->nullable(); //fk => roles
$table->foreign('fk_user_role')->references('id')->on('users')->onDelete('cascade');
$table->foreign('fk_role_user')->references('id')->on('roles')->onDelete('cascade');
});
}
Et puis j'essaie d'obtenir tous les enregistrements avec leur relation dans un contrôleur:
public function index()
{
$users = User::with('roles')->get();
return $users;
}
J'ai donc besoin d'une autre paire d'yeux pour me dire ce qui me manque ici?
Il manque des instructions return dans les méthodes qui définissent les relations. Ils doivent renvoyer la définition de la relation.
Remplacer
public function roles()
{
$this->belongsToMany('\App\Role', 'fk_user_role', 'user_id', 'role_id');
}
Avec
public function roles()
{
return $this->belongsToMany('\App\Role', 'role_user', 'user_id', 'role_id');
}