web-dev-qa-db-fra.com

Laravel 5 L'interrogation avec des relations provoque l'erreur "Appel à une fonction membre addEagerConstraints () sur null")

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?

41
Tomkarho

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');
}
129
jedrzej.kurylo