ORM 在 laravel 的默认用户控制器和用户模型中不起作用
Posted
技术标签:
【中文标题】ORM 在 laravel 的默认用户控制器和用户模型中不起作用【英文标题】:ORM not working in Default UserController & User Model in laravel 【发布时间】:2018-11-28 09:26:22 【问题描述】:我想获得用户明智的角色。这是我面临的错误....
UserController.php(用户控制器文件)
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\UserRequest;
use App\Employee;
use App\Role;
use App\User;
use App\Site;
use App\Client;
use App\ProjectType;
use App\UserPermission;
use Auth;
use DB;
use App\Project;
class UsersController extends BaseController
public function __construct()
$this->isSetClientAndProjectType();
$data = User::with('Role')->first();
echo "<pre>";print_r(json_decode($data)); die;
User.php(用户模型文件)
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
use SoftDeletes;
use Notifiable;
protected $fillable = [
'name', 'role_id', 'password', 'siteid', 'email', 'status', 'allowed_to_bypass_pm', 'allowed_to_bypass_admin'
];
protected $hidden = [
'password', 'remember_token',
];
// Get users roles
public function Role()
return $this->hasMany('App\Role', 'role_id', 'id');
错误是
我该如何解决这个错误?
帮帮我。
谢谢。
【问题讨论】:
【参考方案1】:如果一个用户有很多“角色”,它应该是public function roles()
。
您已定义:
单个用户有一个role_id
因此你需要:
如果一个用户只有一个角色,那就是:
public function role()
return $this->belongsTo('App\Role');
角色模型的反面是:
public function users()
return $this->belongsToMany('App\User');
因为许多用户可以拥有相同的角色。
希望这会有所帮助。
【讨论】:
用户只有一个角色 你有Role
模特吗?
从字面上复制并粘贴我写的 role() 函数或@rkj 的答案,您不需要添加foreign_key 和本地密钥。字面意思是 return $this->belongsTo('App\Role');
或 return $this->belongsTo(Role::class);
确保它是一个小写的 R 代表函数名称和工作完成的角色。
namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use DB; class Role extends Model use SoftDeletes; protected $fillable = [ 'role_name' ];
这是我的榜样
在角色上定义相反的内容,因为您稍后可能会需要它。即选择具有给定角色的所有用户。阅读你上面的评论@vijayChauhan【参考方案2】:
你需要添加belongsTo
关系
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
use SoftDeletes, Notifiable;
protected $fillable = [
'name', 'role_id', 'password', 'siteid', 'email', 'status', 'allowed_to_bypass_pm', 'allowed_to_bypass_admin'
];
protected $hidden = [
'password', 'remember_token',
];
// Get user's role
public function role()
return $this->belongsTo('App\Role');
现在获取数据
$user = User::with('role')->find(1);
$role = $user->role;
【讨论】:
如果您在users
表中有role_id
,在roles
表中有id
,那么belongsTo
肯定可以工作。试试,复制并粘贴我的代码
ibb.co/bu8gUd(数据库-角色表链接)ibb.co/nzF6vJ(数据库-用户表链接)
一切看起来都不错。您是否替换了 User
模型中的更改?
不,粘贴所有代码。再次出现同样的错误兄弟。
让我们continue this discussion in chat.【参考方案3】:
您需要确保您的表结构和外键引用与使用的模型关系方法兼容。
例如,您在 User 模型上使用了“HasMany”关系。为此,您必须确保用户表(用户模型)中的每个记录/行在角色表(角色模型)中“有很多”关联记录/行。
这里的 HasMany 方法假定角色表(角色模型)上有一个外键“role_id”。在找不到哪个时,它会引发错误。
您首先需要根据您的要求考虑角色和用户表(用户和角色模型)的表结构,然后相应地添加模型关系方法。
如果你是第一次使用这些方法可能会有点棘手,你可以参考 laravel 文档:
eloquent-relationships
【讨论】:
以上是关于ORM 在 laravel 的默认用户控制器和用户模型中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 laravel 之外使用 ORM 找不到我的测试模型“用户”[关闭]