🌊
LaravelでEloquentモデルの属性情報をアクセサーを含めて返却する
環境
確認したのはv8
概要
Laravelを用いてEloquentモデルの属性を取得するには、getAttributes()
メソッドが存在しています。しかしながらこちらのメソッドでは、appendsで指定したアクセサーは取得されません。
public function getAttributes()
{
$this->mergeAttributesFromCachedCasts();
return $this->attributes;
}
どうするのか
\Illuminate\Database\Eloquent\Concerns\HasAttributes
トレイトを見ているとattributesToArray()
というメソッドが見つかります。
public function attributesToArray()
{
$attributes = $this->addDateAttributesToArray(
$attributes = $this->getArrayableAttributes()
);
$attributes = $this->addMutatedAttributesToArray(
$attributes, $mutatedAttributes = $this->getMutatedAttributes()
);
$attributes = $this->addCastAttributesToArray(
$attributes, $mutatedAttributes
);
foreach ($this->getArrayableAppends() as $key) {
$attributes[$key] = $this->mutateAttributeForArray($key, null);
}
return $attributes;
}
実際にソースを見ると、ミューテーターの属性を追加しているようになっています。
これでアクセサーの属性に関しても返却してくれるようになりました。
余談
実はモデルのtoArray()
メソッドを見るとこちらのメソッドを利用していることがわかります。
public function toArray()
{
return array_merge($this->attributesToArray(), $this->relationsToArray());
}
先にモデルをjsonで返却するときにappendsの属性が返ってきてるんだからそちらから先に読みに行くべきでしたねえ
Discussion