Laravel 的 DB 查詢是如何實現欄位型別自動轉的?
最近使用 Laravel 寫了一段程式,首先程式在 執行環境A 部署,沒有發現任何問題返回資料該是 Integer 的還是 Integer。但是最近將程式原封不動的部署在 執行環境B 情況卻發生了變化。所有的 Integer 型都變成了 String 型。導致部分 Javascript 部分的 switch 或者 if 出現了不該出現的問題。
雖然通過重構程式碼可以解決問題,但是由於涉及的程式碼片段範圍比較廣泛,不便於修改程式碼片段解決。不知道有沒有什麼辦法讓 執行環境B 中執行的程式也像 執行環境A 中的程式返回 Integer 型呢?
兩個執行環境部署方法一致,且資料庫欄位型別已經檢查確認沒有問題。查閱了網上部分說明貌似 Laravel 會自動轉換型別?感謝大家的指點。
執行環境 A 返回樣例
'''
{
"data1": 1,
"data2": 0,
"data3": "example"
}
'''
執行環境 B 返回樣例
'''
{
"data1": "1",
"data2": "0",
"data3": "example"
}
'''
解決辦法
原來是PDO 設定問題, laravel中的 Illuminate\Database\Connectors\Connector
有:
protected $options = array( PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMULATE_PREPARES => false, );
關鍵的一項: PDO::ATTR_STRINGIFY_FETCHES => false
舉個例子,有一條sql如:select * from factory limit 1
用php PDO查出結果集如下:
注意綠色框裡的值均為 string 型;
但是用 laravel的方式,DB::connection()->select("select * from factory limit 1");
結果集如下:
同樣結果,不同的是欄位值的型別不同,原生的PDO 均是string ,但laravel 會轉成相應的 int/float 型。。。
laravel 是如何做到的?debug 好久都沒找出原因,求指教~