Laravel 以Json 格式保存資料的方法及原因

數據庫中建立一個以txt作格式的欄位

$data = [
    'title' => $request->title,
    'user_name' => $request->user_name
];
$topic->data = json_encode($data);
$topic->save();

這樣便會才json 格式寫入SQL

讀取時在blade中

{{json_decode($topic->data)->title}}
{{json_decode($topic->data)->user_name}}

在Controller 中按條件搜尋

Topic::where("data->user_name", $user_name)->first();

為什麼?使用 Json 來保存的原因?

其實應該是前言?因為內容太簡單,而為什麼要用json 的理由太長.....

為什麼?

我在以前做某些系統「數據庫規劃」時經常遇到的問題,就是明明是同一個架構中的東西,但該條記錄的規格或架構卻完全不同

比如: 產品A 的產品詳情

欄位 內容
名稱 香蕉
長度(CM) (INT) 15
重量(克) (INT) 125
售價(INT) 5.6

但產品B的產品詳情

欄位 內容
名稱 ABC機械鍵盤
種類 (VARCHAR) 黑軸
鍵數 (INT) 87
售價 (VARCHAR) 聯絡我們的客服查詢

以上這類情況大家遇過嗎?或者我舉的例子不是太好,但如果真的要滿足上面的方法,小弟不才只能想到2個方法

方法1,把所有有可能出現的欄位都建立好 方法2,為不同類別的產品建立不同的Model ,建立不同類型的SQL表

但如果是用了json 去保存,跟本不會在這些問題,或者你會問,那在前台顯示時,模版不是要寫非常多的IF? if 長度沒有,就不顯示長度之類的?

其實不是,在以json 保存內容的時候,其實我會再新增一個類似叫type的欄位,把他們分類,比如上面的例子,產品a會把他設定 type=1(水果) ,產品B 設為 type=2 (鍵盤),然後前台就按照type 的值分別載入不同的模板

這樣做解決了什麼?

就是原本有少少差異化的東西,是需要分2張數據表(table)去做,現在只需要用1張數據表就ok

我也是因為使用Laravel notifications,而深入了解一下他的數據邏輯,其實wordpress也早就這樣去做設定,不然怎麼可能一個程式可滿足那麼多不同需要的人?

關聯式數據庫的支援

我是用mysql / mariadb,其實支援已經不錯了,但如果想大量使用json 或者建議你了解一下PostgreSQL ,印象中對json 的支援會更有優勢?!

MYSQL 搜尋json 內容的語法

請參考:https://skychoy.com/posts/53-select-json-data-in-mysql