2017-09-04 8 views
0

私のデータベースの表の列は、jsonタイプとして保存されます。保存したjsonオブジェクトにキーテンプレートのキー値を表示したいのですが、わかりません。Eloquentコレクションのjson type列のアクセスキー?

Newsletterモデルのテーブルスキーマには$table->json('meta')があります。metaカラムは、値として{"foo": "bar"}

$newsletter->meta->fooのようなものを取得するにはどうすればよいですか? $newsletter->metaは、Laravel 5.5ではデフォルトでjsonオブジェクトの代わりにstringを返しますので、それを変換するには簡単なjson_decodeが必要です。

すべての呼び出しでjson_decode以外のクリーナーソリューションは、その列のアクセサを使用することです。 getMetaAttributeしかし、それはまだ乱雑です。私は自動的にjson PHPオブジェクトの検出に列をしたい、どうすればこれを行うことができますか?

答えて

2

Eloquentにautomatically convert typesのモデル属性を指示できるモデル内にprotected $casts配列を宣言できます。あなたの場合は、このようになります:

/* 
* @property string $meta - json is actually just a string 
*/ 
class Newsletter extends Model { 

    protected $casts = [ 
     'meta' => 'array', 
    ]; 
} 

// Now you can use `$meta` as array: 
$newsletter = Newsletter::find(1); 
$foo = array_get($newsletter->meta, 'foo'); 

しかし、これはまだオブジェクトに変換されません。有効なキャストタイプであるとドキュメントにはobjectが記載されていますが、それが何であるかを正確に伝えることはできません。

メモとして、これらの$castsは双方向ではありません。 Newsletterインスタンスにmetaを設定する場合は、オブジェクトまたは配列をjson文字列に変換する独自の機能を作成する必要があります。 Eloquentを使用すると、モデルにmutatorsを定義してジョブを完了させることができます。

+0

ありがとう、なぜフレームワークがデフォルトでオブジェクトではなく文字列に 'json'カラムをキャストするのが好きですか?これを無効にする方法はありますか?私は数十のモデルとさまざまなコラムで作業していますので、個々にキャストするのではなく、これをグローバルに有効にしたいと考えています。 –

+0

Eloquentは、あなたの属性の値を自動的には分析しません。それは、あなたがそれについて考えれば、奇妙な(そして非常に非効率的な)ものになります。 JSONデータ自体は本質的に単なるphpの文字列です。 –

関連する問題