Laravel Eloquent:构建模型时如何设置自定义属性?

时间:2018-09-09 17:06:54

标签: laravel constructor eloquent override

我正在尝试向我的用户模型添加自定义属性“角色”。我当前的实现是这样的:

User extends Authenticatable
{
   protected $appends = array('role');

   public $getRoleAttribute()
   {
     $role = DB::table('acl_user_has_roles')->where('user_id', $this->id)
               ->value('role');
     return $role;
   }
}

此实现在很大程度上有效。值得关注的是,此角色属性在$ user实例的生存期内被多次引用。无论何时引用,都会调用getRoleAttribute()函数,然后将执行数据库查询。对我来说似乎有点不必要,所以我试图找到一种方法只运行一次这些查询,最好是在构造模型实例时:

我试图将answer中所述的模型构造函数覆盖到另一个类似的问题:

public $role;

public function __construct(array $attributes = array())
{
    parent::__construct($attributes);

    $this->role= $this->role();
}

protected function role()
{
  $role = DB::table('acl_user_has_roles')->where('user_id', $this->id)
               ->value('role');
  return $role;
}

当我尝试像这样引用角色属性时:

$user = User::find(1);
echo $user->role;

我什么也没得到。

如果我只是将角色属性设置为一些虚拟文本:

$this->role = "Dummy Role";

代替:

$this->role();

然后我可以得到此“虚拟角色”文本。

我在这里想念什么?

0 个答案:

没有答案