【问题标题】:Eloquent Model's relations not working; Not even a queryEloquent 模型的关系不起作用;甚至没有查询
【发布时间】:2017-12-27 15:04:41
【问题描述】:

如下面的代码所示,我在父子关系中有一个用户和一个角色模型。发生的事情是我可以通过父母访问孩子,但反之则不行。访问孩子的角色 ($user->role) 只会给我 ID。角色列在角色表上有一个外键,但相反的不起作用。 基本上, $role 包含所有用户 $user->role 不显示用户的角色,只显示他的id

Laravel-Debugbar 还显示用户不执行额外查询,而角色执行。

用户表

id name email password remember_token client role created_at updated_at

角色表

id name display_name description created_at updated_at

用户模型

namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Laratrust\Traits\LaratrustUserTrait;
use App\Client;
use App\Role;
use App\Permission;

class User extends Authenticatable
{
    use LaratrustUserTrait;
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password','role',
    ];
    public function client(){
        return $this->hasOne('App\Client', 'client');
    }
    public function role(){
        return $this->belongsTo('App\Role')->withDefault();
    }
}

榜样

namespace App;

use Laratrust\Models\LaratrustRole;
use App\Permission;
use App\User;

class Role extends LaratrustRole
{
            protected $fillable = [
        'name', 'display_name', 'description',
    ];
        public function GetHasPermission($perm){
            return DB::table('permission_role')->where('role', $this->id)
                    ->where('permission',$perm)->first()->value('type');
        }
        public function users(){
            return $this->hasMany('App\User','role', 'id');
        }
        public function permissions(){
            return $this->hasMany('App\Permission');
        }
        public function getName(){
            return $this->name;
        }
}

编辑:应该注意我使用的是 Laratrust。

【问题讨论】:

    标签: php laravel eloquent laravel-eloquent


    【解决方案1】:

    由于您没有关注Laravel naming conventions,因此您需要手动定义外键。因此,将role() 关系更改为:

    public function role()
    {
        return $this->belongsTo('App\Role', 'role')->withDefault();
    }
    

    https://laravel.com/docs/5.5/eloquent-relationships#one-to-many-inverse

    然后使用->role()->first() 而不是->role->role() 直接使用关系。 ->role 首先尝试使用对象的属性,如果它不存在,它会加载相关数据(对象或集合)。由于 User 对象具有 role 属性,Laravel 使用它而不是加载相关的 Role 对象。

    【讨论】:

    • 没错。 Laravel 正在寻找一个 role_id 而不是角色
    • 已经试过了;即使它应该是正确的也不起作用。
    • @Statharas.903 我很确定代码是正确的。如果您需要帮助,请告诉我此代码有什么错误。
    • 以任何方式拉取用户模型根本不会显示父(角色)。具体来说,我正在执行 Auth::user()->role,它只返回角色的 ID,与 User::find(1) 相同。 Role::find(1)->users 正确返回具有该角色的用户。显然,访问 Auth::user()->role->name 会出现Trying to get property of non-object 错误
    • @Statharas.903 所以,你正在尝试做$user->role。请改用$user->role()->first() 或将关系名称更改为与外键不同的名称。
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2021-06-10
    • 2019-03-03
    相关资源
    最近更新 更多