Laravel Eloquent: как установить собственный атрибут при построении модели? - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь добавить пользовательский атрибут "роль" в мою модель пользователя. Моя текущая реализация выглядит так:

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 (), а затем выполняются запросы к базе данных. Мне это кажется немного ненужным, поэтому я пытаюсь найти способ выполнить эти запросы только один раз, предпочтительно, когда создается экземпляр модели:

Я попытался переопределить конструктор модели, как описано в ответ на другой похожий вопрос:

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;

Я ничего не получаю.

если я просто установлю для атрибута role какой-нибудь фиктивный текст:

$this->role = "Dummy Role";

вместо:

$this->role();

Тогда я смогу получить этот текст "Роль пустышки".

Что мне здесь не хватает?

...