【问题标题】:ORM not working in Default UserController & User Model in laravelORM 在 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');
 }
}

错误是

我该如何解决这个错误?

帮帮我。

谢谢。

【问题讨论】:

    标签: laravel laravel-5 orm relationship


    【解决方案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 模型中的更改?
    • 不,粘贴所有代码。再次出现同样的错误兄弟。
    【解决方案3】:

    您需要确保您的表结构和外键引用与使用的模型关系方法兼容。

    例如,您在 User 模型上使用了“HasMany”关系。为此,您必须确保用户表(用户模型)中的每个记录/行在角色表(角色模型)中“有很多”关联记录/行。

    这里的 HasMany 方法假定角色表(角色模型)上有一个外键“role_id”。在找不到哪个时,它会引发错误。

    您首先需要根据您的要求考虑角色和用户表(用户和角色模型)的表结构,然后相应地添加模型关系方法。

    如果你是第一次使用这些方法可能会有点棘手,你可以参考 laravel 文档:

    eloquent-relationships

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2014-07-03
      • 1970-01-01
      • 2015-04-02
      • 2019-12-14
      • 2020-07-07
      • 2018-09-15
      相关资源
      最近更新 更多