2017-09-04 23 views
0

我的數據庫中的表格列保存爲json類型。我想在我的刀片模板上顯示保存的json對象中的鍵控值,但我不確定如何。用於Eloquent集合的json類型列中的訪問鍵?

假設我在Newsletter模型的表格模式中有$table->json('meta'),其中meta列有例如0。作爲價值的{"foo": "bar"}

我該如何檢索$newsletter->meta->foo之類的東西?由於$newsletter->meta默認在Laravel 5.5中返回字符串而不是json對象,因此需要一個簡單的json_decode來轉換它。

除了每次調用json_decode之外,更清潔的解決方案是使用該列上的訪問者,例如getMetaAttribute但這仍然是一團糟。我想自動將json列轉爲PHP對象檢測,我該如何做到這一點?

回答

2

您可以在模型中聲明protected $casts數組,您可以在其中指示模型屬性的Eloquent automatically convert types。在你的情況下,看起來像這樣:

/* 
* @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字符串。雄辯使您可以在模型上定義mutators以完成工作。

+0

謝謝,是否有任何理由爲什麼框架喜歡鑄造'json'列默認情況下字符串而不是對象?有沒有辦法來覆蓋這個?我正在使用幾十個模型和各種各樣的列,所以我想要全局啓用它,而不是逐個單獨投射。 –

+0

雄辯不會自動分析你的屬性的值,如果你仔細想想,那將是一種奇怪的(而且效率非常低)。 JSON數據本身基本上只是一個字符串到PHP。 –