イントロダクション

JSONでAPIを作成する場合にはモデルとリレーションを配列やJSONに変換する必要が良く起きます。そのためEloquentはシリアライズ結果にどの属性を含むかをコントロールしながら、変換を行う便利なメソッドを含んでいます

基本的な使用法

モデルを配列へ変換

モデルと同時にロードされているリレーションを配列に変換する場合、toArrayメソッドを使います。このメソッドは再帰的に動作しますので、全属性と全リレーション(リレーションのリレーションも含む)は配列へ変換されます。

$user = App\User::with('roles')->first();

return $user->toArray();

コレクションを配列に変換することもできます。

$users = App\User::all();

return $users->toArray();

モデルをJSONへ変換

モデルをJSONへ変換するにはtoJsonメソッドを使います。toArrayと同様にtoJsonメソッドは再帰的に動作し、全属性と全リレーションをJSONへ変換します。

$user = App\User::find(1);

return $user->toJson();

もしくはモデルやコレクションが文字列へキャストされる場合、自動的にtoJsonメソッドが呼び出されます。

$user = App\User::find(1);

return (string) $user;

文字列にキャストする場合、モデルやコレクションはJSONに変換されますので、アプリケーションのルートやコントローラーから直接Eloquentオブジェクトを返すことができます。

Route::get('users', function () {
    return App\User::all();
});

JSONに含めない属性

モデルの配列やJSONにパスワードのような属性を含めたくない場合があります。それにはモデルの$hiddenプロパティーに定義を追加してください。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 配列に含めない属性
     *
     * @var array
     */
    protected $hidden = ['password'];
}

注意: リレーションを含めない場合はリレーションの動的プロパティー名ではなくメソッド名を指定してください。

もしくはモデルの配列やJSONに含めるべき属性のホワイトリストを定義するvisibleプロパティーを使用してください。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 配列中に含める属性
     *
     * @var array
     */
    protected $visible = ['first_name', 'last_name'];
}

JSONへ値を追加

データベースに対応するカラムがない属性の配列を追加する必要がある場合も時々あります。これを行うには最初にその値のアクセサーを定義します。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザーの管理者フラッグを取得
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 'yes';
    }
}

アクセサーができたらモデルのappendsプロパティーへ属性名を追加します。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * モデルの配列形態に追加するアクセサー
     *
     * @var array
     */
    protected $appends = ['is_admin'];
}

appendsリストにアクセサーを追加するとモデルの配列とJSON形式両方に含まれるようになります。appends配列の属性もモデルのvisiblehiddenの設定に従い動作します。