在專案開發中經常會使用到一些特殊的值作為陣列的索引,一般可以先查詢出資料后陣列回圈拼接成所需的格式,不過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();
查詢結果如下:
{ "1001": { "uid": "1001", "name": "張三" }, "1002": { "uid": "1002", "name": "李四" }, "1003": { "uid": "1003", "name": "王五" } }
如需使用運算式的值做為索引,那么只需要傳遞一個匿名函式給indexBy()方法即可:
// 以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’) 不要帶表名前綴,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/107500.html
標籤:PHP
