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

SkyChoy
5 分鐘閱讀

數據庫中建立一個以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