2015年6月5日 星期五

Laravel stdClass Object 轉 Array

(我想我最近已經寫 code 寫到不知道在幹嘛了...)

在使用 Laravel 的時候,從 DB (Mysql) 拿資料出來時,你可以透過 PDO Fetch style 去改變拿出來時的型態(取 ASSOC 或是 CLASS),這時候只要改變 database 的 config 就可以了(參考),又或者你只有某一部份的 sql 需要改變 PDO Fetch style,那你也可以單獨寫設定在程式裡,記得在結束後把設定改回來:

// 參考自 http://stackoverflow.com/questions/26174267/convert-laravel-object-to-array

// 改變 PDO 的 style
DB::setFetchMode(PDO::FETCH_ASSOC);

// array of arrays instead of objects
DB::table(..)->get();

// 改回原本的 PDO style
DB::setFetchMode(PDO::FETCH_CLASS);

另外一個情境是,我的資料是先預先存在 Redis 裡面,如果 Redis 取不到資料,就會跟 Mysql 要,拿到資料後再 json_encode 塞到 Redis,但是這兩者取出的資料格式會變成 stdClass v.s Array,麻煩的是我希望 Redis 取出的格式是跟著 Mysql 的,所以是 Reids 的 stdClass 要轉為 Array()。


要讓 redis 取出的格式跟 mysql 一樣都是 array 的話,
在 json_decode 時要記得加第二個參數 true 就可以讓他以 Array 的方式回傳了:
json_decode($redis->get('key'), true);
老實說要不是因為發現 redis 取出之後型態不同,我還真的沒發現 json_decode 的第二個參事就是 assoc 的意思,只是預設是 false :P。原來一個簡單的參數就可以解決我的問題,差點還以為要上網找一些奇怪的 method 來轉換 :P 感謝天
end.

5 則留言:

  1. array 要改 stdClass object 只需要 return (object)$your_arry_data;

    回覆刪除
  2. json_decode($redis->get('key', true));

    應該改為

    json_decode($redis->get('key'), true);

    XD

    回覆刪除
  3. 我都直接用程式轉,用is_object判斷,然後轉array

    回覆刪除

若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...