Задать вопрос
@photosho

Почему метод getAttribute не записывает свойства класса?

Всем снова привет. В модели статьи имеется некоторый метод "getUserIdAttribute()", считывающий ID автора этой статьи. Также, имеется public-свойство "author", являющееся массивом. В это свойство вышеуказанный метод записывает необходимые параметры автора:

public function getUserIdAttribute($value) {
	$this->author['name'] = User::find($value)->username;
	$this->author['id'] = $value;
}


К сожалению, почему-то данные в свойство $author записываться не хотят. Если создать внутри класса модели public-функцию, проделывающую те же действия, то она нормально запишет свойство $author. Это так и должно быть или я опять что-то делаю не так?

И второй вопрос. Строка: User::find($value)->username, насколько я понимаю, считывает из базы все поля пользователя под номером $value и затем берет значение поля "username"? Чтобы считать только требуемые поля, нужно сделать что-то вроде такого?

User::where('id', '=', $value)->first();
  • Вопрос задан
  • 146 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
v_decadence
@v_decadence
1. Вы точно уверены, что функция вообще вызывается? Поставьте в неё echo или dd.
2. find находит запись по первичному ключу. Чтобы получить только определенные поля, нужно передать их имена вторым параметром
User::find($value, ["id", "username"]).
Ответ написан
@photosho Автор вопроса
Во всем разобрался. Почему-то думал, что "get*Attribute" вызывается после считывания значения поля из базы данных, но, на самом деле, эта функция вызывается при попытке считать значение поля из объекта ($post->user_id).

Следовательно, в таком варианте:

public function getUserIdAttribute($value) {
  $this->author['name'] = User::find($value)->username;
  $this->author['id'] = $value;
  return $value;
}


Если просто считать значение свойства $author, оно все еще не будет установлено, оно установится после вызова свойства $user_id ($post->user_id). Следовательно, проблема решается установкой функции преобразования для свойства $author:

protected $author = [];

public function getAuthorAttribute() {
	$this->author['id'] = $this->user_id;
	$this->author['name'] = User::find($this->author['id'], ['username'])->username;
	return $this->author;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы