連載
##JSON へのシリアル化
- JSON プロパティを非表示
- JSON 値を追加
- #はじめに JSON API を構築するとき、多くの場合、モデルと関係を配列または JSON に変換する必要があります。これらの操作のために、Eloquent はシリアル化でいくつかの便利なメソッドとプロパティ コントロールを提供します。
- シリアル化されたモデルとコレクション
配列へのシリアル化
モデルとそのロードされた関連付けを配列に変換するには、toArray
メソッドを使用できます。これは再帰的メソッドであるため、すべての属性と関連付け (関連付けられた関連付けを含む) が配列に変換されます:
$user = App\User::with('roles')->first();return $user->toArray();
モデル コレクション全体を配列に変換することもできます:
$users = App\User::all();return $users->toArray();
Serialize to JSON
メソッドtoJson
はモデルを JSON に変換できます。メソッド toArray
と同様、toJson
メソッドは再帰的であるため、すべてのプロパティとリレーションシップが JSON に変換されます。PHP でサポートされている JSON エンコーディング オプション を指定することもできます。 :
$user = App\User::find(1); return $user->toJson(); return $user->toJson(JSON_PRETTY_PRINT);
モデルまたはコレクションを文字列に変換することもできます。メソッド 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']; }
{note関連付けを非表示にする場合は、関連付けられたメソッド名を使用する必要があります。
さらに、属性 $visible
を使用して、JSON に表示されるモデルの配列とホワイトリストを定義することもできます。変換された配列または JSON には他の属性は表示されません:
<?phpnamespace App; use Illuminate\Database\Eloquent\Model; class User extends Model{ /** * 数组中的属性会被展示。 * * @var array */ protected $visible = ['first_name', 'last_name']; }
表示される属性を一時的に変更します
モデル インスタンスで非表示の属性を表示する必要がある場合は、次の操作を行うことができます。 makeVisible
メソッドを使用します。メソッド makeVisible
モデル インスタンスを返します:
return $user->makeVisible('attribute')->toArray();
これに応じて、モデル インスタンスの表示属性を非表示にする必要がある場合は、makeHidden
メソッドを使用できます。
return $user->makeHidden('attribute')->toArray();
JSON 値を追加
場合によっては、データベースの配列または 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']; }
append
メソッドを使用してプロパティを追加すると、そのプロパティはモデルの配列と JSON に含まれます。 appends
配列内のプロパティは、モデルに構成された visible
および hidden
設定も尊重します。
実行時の追加
単一モデル インスタンスで、メソッド append
を使用してプロパティを追加するか、メソッド setAppends# を使用します。 ## 追加された属性の配列全体を上書きします:
return $user->append('is_admin')->toArray(); return $user->setAppends(['is_admin'])->toArray();
シリアル化された日付
任意の属性の日付形式をカスタマイズする
Eloquent の属性タイプ変換で日付属性の日付形式を個別にカスタマイズできます:
protected $casts = [ 'birthday' => 'date:Y-m-d', 'joined_at' => 'datetime:Y-m-d H:00', ];
Carbon グローバル カスタマイズ
Laravel は、Carbon の JSON シリアル化を容易にする Carbon データ ライブラリを拡張します。アプリケーション全体ですべての Carbon 日付のシリアル化をカスタマイズするには、Carbon::serializeUsing
メソッドを使用できます。メソッド serializeUsing
は、日付を文字列として返すクロージャを受け入れます。
<?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() { // } }