dtpxi88884
2018-09-07 12:35
浏览 47
已采纳

Laravel雄辩的模特关系

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?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • duanqiao8925 2018-09-07 12:53
    已采纳

    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.

    已采纳该答案
    打赏 评论
  • douzi8548 2018-09-07 12:44

    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

    打赏 评论
  • douyi2664 2018-09-07 12:56

    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

    打赏 评论

相关推荐 更多相似问题