LoginSignup
6
7

More than 5 years have passed since last update.

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

Posted at

結論

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 にアクセス可能となる。

おしまい。

6
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7