Laravel 從 5.0 版本開始就已支持 JSON 數據的轉換,但這樣做的目的只是為了方便數據處理。你的數據依然以 TEXT 類型存放在你的數據庫里。不過 MySQL 從 5.7 版本起開始支持原生 JSON 數據類型,這將為我們的開發帶來便捷, Laravel 5.3 也為基於 JSON 類型的數據查詢和更新引入了新的語法。
假設我們有一個包含 JSON 類型字段的數據表:
class CreateContactsTable extends Migration { public function up() { Schema::create('contacts', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->json('meta'); $table->timestamps(); }); }
我們假設每個 contacts 表單都包含一些基本信息,比如聯系人姓名。但是另外的一些屬性是非常靈活的,這些屬性最好以 JSON 類型方式進行存儲 —— 就像上文的 meta 字段。
where() 語法介紹
假定某個 contects 的表單信息如下:
{ "id": 1, "name": "Monkey", "meta": { "wants_newsletter": true, "favorite_color": "red" } }
現在我們想要獲取所有 favorite_color 為 red 的用戶,我們可以這么寫:
$redLovers = DB::table('contacts') ->where('meta->favorite_color', 'red') ->get();
這段代碼將會從 contacts 表中把 meta 字段的 favorite_color 屬性值為 red 的所有數據讀取出來。
update() 語法介紹
我想將上文的 Monkey 用戶的 wants_newsletter 設置為 false,可以這樣寫:
DB::table('contacts')
->where('id', 1)
->update(['meta->wants_newsletter' => false]);
值得注意的是,在上文代碼中,即使 wants_newsletter 鍵值在此之前不存在,現在也會被創建並設置為 false。
看到它的強大之處沒?在 5.3 里我們可以基於 JSON 字段屬性進行查詢,可以更新 JSON 字段中的任一屬性而無需考慮其是否存在。
注:目前僅有 MySQL 5.7+ 數據庫支持這一特性。
