0

My app builds on

Laravel: 5.6.35
PHP 7.2.4
Entrust: 1.9

My Role model

class Role extends EntrustRole
{
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

    public function users()
    {
        return $this->hasMany(User::class);
    }
}

And my User model is

class User extends Authenticatable
{
    public function role()
    {
        return $this->belongsTo(Role::class);
    } 
}

And now you can notice in Tinker

D:\work\www\myapp>php artisan tinker
Psy Shell v0.9.7 (PHP 7.2.4 — cli) by Justin Hileman
>>> App\models\Role::find(1)->users()->get()
Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.role_id' in 'where clause' (SQL: select * from `users` where `users`.`role_id` = 1 and `users`.`role_id` is not null)'
>>> App\User::find(1)->role()->get();
=> Illuminate\Database\Eloquent\Collection {#2937
     all: [],
   }
>>> App\User::find(1)->roles()->get();
=> Illuminate\Database\Eloquent\Collection {#2941
     all: [
       App\models\Role {#2930
         id: 1,
         name: "super-admin",
         display_name: "Super Admin",
         description: "This will be one permission, that can not be assigned or modified.",
         created_at: "2018-09-07 12:11:35",
         updated_at: "2018-09-07 12:11:35",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#2927
           user_id: 1,
           role_id: 1,
         },
       },
     ],
   }

I am getting result for App\User::find(1)->roles(), but my User model has function role(), and empty collection for App\User::find(1)->role() and error for App\models\Role::find(1)->users()

so please give some idea, how to solve this issue?

Prafulla Kumar Sahu
  • 9,321
  • 11
  • 68
  • 105

3 Answers3

1

The way you have defined your relationships, you have to explicitly ask to retrieve that relation:

App\User::with('Roles')->find(1)->roles()

In the documentation, the relationship between user and role is like this:

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

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

This way, you don't have to ask for the relationship

Javi Mollá
  • 786
  • 7
  • 18
0

I think I found the answer to my question here.if you have properly defined relations through hasMany and belongsTo in your models, but haven't provided foreign key in the table of the model who belongsTo other table, your relations won't work. In documentation too, it suggests to use foreign_key to use One-to-Many relationship.

Entrust database design is based on many-to-many relationship. So that user can have multiple roles.Purly as described in Laravel documentation.

Prafulla Kumar Sahu
  • 9,321
  • 11
  • 68
  • 105
0

The probles is either in the way your relationship is created or in your table, the error says

 Unknown column 'users.role_id' in 'where clause'

that means that in your users table is missing the column role_id, when you make a relationship like

public function users()
{
    return $this->hasMany(User::class);
}

The hasMany will try to find thetablename_id in the model you're passing, if you want to get them by a third table you could use belongsToMany on your permission Model or using polymorphic relationships

Carlos Salazar
  • 1,818
  • 5
  • 25
  • 48