这本书是我做的,是我的laravel程序的角色。问题发生在一个特定的实例中,用户模型中的方法之一总是“弹出”……无论用户对role_id拥有什么,方法总是显示某些角色的名称,在这种情况下为“主持人”。不知道它有什么问题,或者至少我看不到它...
这是用户模型:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',"avatar"
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function rola(){
return $this->belongsTo("App\Roles", "id");
}
public function posts(){
return $this->hasMany("App\Post");
}
public function comments(){
return $this->hasMany("App\Comment");
}
public function isAdmin()
{//dd($user);
return $this->rola()->where('role', 'administrator');
}
public function isModerator()
{//dd($user);
return $this->rola()->where('role', 'moderator');
}
public function isUser()
{//dd($user);
return $this->rola()->where('role', 'user');
}
public function isPeon()
{//dd($user);
return $this->rola()->where('role', 'peon');
}
}
这是角色模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Roles extends Model
{
public function rola(){
return $this->hasMany("App\User", "role_id");
}
}
例如,如果仅在任何视图中显示:
{{auth()->user()->rola->id}} <br> // 2 <- correct
{{auth()->user()->role_id}} // 3 <- this should be 2 also.
默认情况下,每当新用户注册时,它都会自动收到ID为4的“ peon”角色。 不知道我的错误在哪里,也许我没看到东西...
编辑1:
这里是指向github repo的链接,供那些想念它的人使用。
答案 0 :(得分:3)
好吧,我认为问题出在 User.php 文件中的rola()
函数中:您正在定义belongsTo
关系的外键,这里是{ {1}}。
应该为id
,因为这是Eloquent试图映射到Roles模型的role_id
的关键。 See the documentation了解更多信息
答案 1 :(得分:3)
要改善您的应用程序,请不要为每个角色使用一个功能。
假设在角色表上有100个角色,使用当前代码,您还将需要100个函数,例如isAdmin
或isSomething
。
添加类似这样的内容:
public function hasRole($roleName)
{
return $this->rola()->where('role', $roleName);
}
/**
* Check if the user has any of the given roles.
*/
public function hasAnyRole(array $roleNames)
{
$userRole = $this->rola;
return in_array($userRole->name, $roleNames);
}
现在您可以检查角色了:
$user->hasRole('admin'); //If the user has the admin role, returns true. Otherwise returns false.
要在刀片视图上检查角色,请执行以下操作:
@if(Auth::check())
@if(Auth::user()->hasRole('role-name') || Auth::user()->hasRoles('another-role-name'))
//Your markup here
@endif
@endif
对于多个角色:
@if(Auth::check())
@if(Auth::user()->hasAnyRoles(['role-name', 'another-role-name']))
//Your markup here
@endif
@endif
希望有帮助。
答案 2 :(得分:0)
问题出在您的rola()
函数中。
您在belongsTo
上使用了错误的外键。应该是role_id
,而不是id
(当前是)。
以下是经过改进的代码段:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',"avatar"
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function rola(){
return $this->belongsTo("App\Roles", "role_id");
//Or just return $this->belongsTo(Roles::class);
}
public function posts(){
return $this->hasMany("App\Post");
}
public function comments(){
return $this->hasMany("App\Comment");
}
public function isAdmin()
{//dd($user);
return $this->hasRole('admin');
}
public function isModerator()
{//dd($user);
return $this->hasRole('moderator');
}
public function isUser()
{//dd($user);
return
return $this->hasRole('user');
}
public function isPeon()
{//dd($user);
return $this->hasRole('peon');
}
public function hasRole($role)
{
return $this->rola->role === $role;
}
}
我建议您将“角色”模型中的rola
函数重命名为users
,因为它会返回所有具有某些角色的用户。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Roles extends Model
{
public function users(){
return $this->hasMany(User::class, 'role_id');
}
}
另一件事:看看this package。它确实可以帮助您处理用户,权限和权限组。
希望有帮助。