Во всем разобрался. Почему-то думал, что "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;
}