Я пытаюсь добавить пользовательский атрибут "роль" в мою модель пользователя. Моя текущая реализация выглядит так:
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();
Тогда я смогу получить этот текст "Роль пустышки".
Что мне здесь не хватает?