🌊

LaravelでEloquentモデルの属性情報をアクセサーを含めて返却する

2023/05/22に公開

環境

確認したのは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