在項目開發中常常會使用到一些特殊的值做爲數組的索引,通常能夠先查詢出數據後數組循環拼接成所需的格式。不過YII2框架提供了一種更簡單的方法indexBy()。數據庫
參考Yii文檔:https://www.yiichina.com/doc/guide/2.0/db-query-builder數組
當你在調用all()方法時,它將返回一個以連續的整型數值爲索引的數組。
而有時候你可能但願使用一個特定的字段或者表達式的值來做爲索引結果集數組。那麼你能夠在調用all()以前使用indexBy()方法來達到這個目的。
例如,框架
// 以uid做爲key值 $query = User::find() ->select(['uid', 'name']) ->indexBy('uid') ->asArray() ->all();
查詢結果以下:yii
{ "1001": { "uid": "1001", "name": "張三" }, "1002": { "uid": "1002", "name": "李四" }, "1003": { "uid": "1003", "name": "王五" } }
如需使用表達式的值作爲索引,那麼只須要傳遞一個匿名函數給indexBy()方法便可:ide
// 以uid和name組合做爲key值 $query = User::find() ->select(['uid', 'name']) ->indexBy(function ($row) { return $row['uid'] . $row['name']; // row中使用的字段名只能是查詢返回的字段名 }) ->asArray() ->all();
查詢結果以下:函數
{ "1001張三": { "uid": "1001", "name": "張三" }, "1002李四": { "uid": "1002", "name": "李四" }, "1003王五": { "uid": "1003", "name": "王五" } }
注意: 與 groupBy() 或者 orderBy() 等查詢方法不一樣, 他們將轉換爲 SQL 查詢語句的一部分,而這個方法(indexBy)在從數據庫取回數據後才生效執行的。 這意味着只能使用那些在你的 SELECT 查詢中的列名。 此外,你用表名鏈接取列名的時候,好比 customer.id,結果中將只包含 id 列,所以你必須調用 ->indexBy(‘id’) 不要帶表名前綴。ui