連載


配列へのシリアル化

##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()  
       {      
         //   
        }
     }
この記事は、LearnKu.com Web サイトで初めて公開されました。