Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

laravel で getHogeAttribute の値も json の出力などに自動的に含めたい時の方法

More than 5 years have passed since last update.

結論

Model に toArray() メソッドを実装し、その中でよしなに設定すると良い。

例と方法

前提:

  • User Model には first_name, last_name フィールドが存在している。
  • $user->full_name とすると、$user->first_name . ' ' . $user->last_name が表示される様に getAttribute を用いて設定している。
<?php
class User extends Model {

    protected $fillable = [
        'first_name',
        'last_name',
    ];

    public function getFullNameAttribute()
    {
        return $this->first_name . ' ' . $this->last_name;
    }

}

上記の Model の状態だと、以下のように $user->full_name が使える

User::create([
    'first_name' => 'さんぷる',
    'last_name' => 'いちごう',
]);
$user = User::find(1);
echo $user->full_name; // 「さんぷる いちごう」となる

getFullNameAttribute メソッドは echo など、文字列化の必要に迫られた際に toString マジックメソッド経由で呼び出される。

getFullNameAttribute にアクセスできない例:

どこからも文字列化されない(toStringからアクセスされない)場合は、 $user->full_name が使えない。

例えば、 Json で値を返却する時など。

以下の様なケース。

$user = User::find(1);
return response()->json(['user' => $user]);

このとき、上記の response を受け取った javascript などでは、response.user.full_name が存在しない。(toString 通ってないから。)

response.user.first_nameresponse.user.last_name だけが存在する状態。

Json 化した際なども response.user.full_name でアクセスさせる方法:

結論から書くと、 Model に toArray メソッドを実装することで実現できる

<?php
class User extends Model {

    protected $fillable = [
        'first_name',
        'last_name',
    ];

    public function getFullNameAttribute()
    {
        return $this->first_name . ' ' . $this->last_name;
    }

    /**
     * このメソッドを追加
     */
    public function toArray()
    {
        return array_merge(
            parent::toArray(),
            ['full_name' => $this->full_name]
        );
    }

}

response()->json('user' => $user); の中で、 $user->toArray() が呼ばれて配列化される。

User Model に toArray を実装していない場合は、 Illuminate\Database\Eloquent\Model の toArray メソッドが呼ばれる

このため、 User Model の toArray メソッドで適切に処理をすることで、 json 化した後でも full_name にアクセス可能となる。

おしまい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away