Tomkarho
Tomkarho

Reputation: 1817

Laravel 5 Querying with relations causes "Call to a member function addEagerConstraints() on null" error

I have been trying to create a simple user management system but keep on hitting road blocks when it comes to querying relations. For example I have users and roles and whenever I try to make a query for all users and their roles I get an error. The one in the title is only the latest one I've encountered.

My User and Role Models look like this:

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');
    }
}

My migration table for many-to-many relationship between the two looks like this:

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');
        });
    }

And then I try to get all records with their relation in a controller:

public function index()
{
    $users = User::with('roles')->get();

    return $users;
}

So I need another pair of eyes to tell me what is it I am missing here?

Upvotes: 89

Views: 79554

Answers (5)

Adeel Empire
Adeel Empire

Reputation: 43

Role Model:

 class Role extends Model
{
    public function users()
    {
       return $this->belongsToMany('\App\User', 'fk_role_user', 'role_id', 'user_id');
    }
}

User model

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany('\App\Role', 'fk_user_role', 'user_id', 'role_id');
    }
}

Upvotes: 0

Leonel Kahameni
Leonel Kahameni

Reputation: 943

You forgot the return in your functions

Do:

return $this->belongsToMany('\App\User', 'fk_role_user', 'role_id', 'user_id');
return $this->belongsToMany('\App\Role', 'fk_user_role', 'user_id', 'role_id');

Upvotes: 13

Enver
Enver

Reputation: 618

You need to use Return for your function's result. If you do not do that, Laravel does not know What should do with that function without any action. Just use like this

return $this->hasOne(xxx, xx, xx);

Enjoy your coding !

Upvotes: 8

Kaleemullah
Kaleemullah

Reputation: 544

Make sure you have written return in your model function relation.

return $this->hasMany('App\StaffShift','user_id','user_id');

Upvotes: 1

jedrzej.kurylo
jedrzej.kurylo

Reputation: 40909

You are missing return statements in the methods that define relations. They need to return relation definition.

Replace

public function roles()
{
    $this->belongsToMany('\App\Role', 'fk_user_role', 'user_id', 'role_id');
}

With

public function roles()
{
    return $this->belongsToMany('\App\Role', 'role_user', 'user_id', 'role_id');
}

Upvotes: 306

Related Questions