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-&gt;belongsTo('App\Role');return $this-&gt;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 订单 分表

在 laravel 之外使用 ORM 找不到我的测试模型“用户”[关闭]

想修改 laravel 默认登录来检查用户是不是被验证

[2018-01-12] laravel--ORM

Laravel:如何使用 eloquent ORM 查找未经过身份验证的用户的信息?

Laravel 5.2 Eloquent ORM 从 3 个表中获取数据