このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。
This project is maintained by okinaka
JSONでAPIを作成する場合にはモデルとリレーションを配列やJSONに変換する必要が良く起きます。そのためEloquentはシリアライズ結果にどの属性を含むかをコントロールしながら、変換を行う便利なメソッドを含んでいます
モデルとロード済みのリレーションを配列に変換する場合、toArray
メソッドを使います。このメソッドは再帰的に動作しますので、全属性と全リレーション(リレーションのリレーションも含む)は配列へ変換されます。
$user = App\User::with('roles')->first();
return $user->toArray();
モデルのコレクションを配列に変換することもできます。
$users = App\User::all();
return $users->toArray();
モデルを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に、パスワードのような属性を含めたくない場合があります。それにはモデルの$hidden
プロパティに定義を追加してください。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 配列に含めない属性
*
* @var array
*/
protected $hidden = ['password'];
}
{note} リレーションを含めない場合は、メソッド名を指定してください。
もしくはモデルを変換後の配列やJSONに含めるべき属性のホワイトリストを定義する、visible
プロパティを使用してください。モデルが配列やJSONへ変換される場合、その他の属性はすべて、変換結果に含まれません。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 配列中に含める属性
*
* @var array
*/
protected $visible = ['first_name', 'last_name'];
}
特定のモデルインスタンスにおいて、通常は配列に含めない属性を含めたい場合は、makeVisible
メソッドを使います。このメソッドは、メソッドチェーンしやすいようにモデルインスタンスを返します。
return $user->makeVisible('attribute')->toArray();
同様に、通常は含める属性を特定のインスタンスで隠したい場合は、makeHidden
メソッドを使います。
return $user->makeHidden('attribute')->toArray();
モデルを配列や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
配列の属性もモデルのvisible
とhidden
の設定に従い動作します。
LaravelはCarbon(日付と時刻を扱うライブラリ)を拡張しており、JSONへシリアライズするために便利なカスタマイズ方法を提供しています。アプリケーション上のすべての日付と時刻が、Carbonによりどのようにシリアライズされるかをカスタマイズするために、Carbon::serializeUsing
メソッドを使います。Carbon::serializeUsing
メソッドは、JSONへのシリアライズのために日付時刻の文字列形式を返すクロージャを引数に取ります。
<?php
namespace App\Providers;
use Illuminate\Support\Carbon;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* サービスの登録後、起動を行う
*
* @return void
*/
public function boot()
{
Carbon::serializeUsing(function ($carbon) {
return $carbon->format('U');
});
}
/**
* コンテナに結合する
*
* @return void
*/
public function register()
{
//
}
}