首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii 框架 AR 模型數組轉換:findAll 多維對象轉數組工具函數實現

     編輯:PHP 相關知識

Yii 框架 AR 模型數組轉換:findAll 多維對象轉數組工具函數

Yii 的 findAll() 返回 ActiveRecord 對象數組,直接 print_r 顯示冗餘屬性。本文提供 actionIndex 示例,演示如何將 AR 對象數組轉為純數據數組,僅保留表字段值,便於 JSON 輸出或模板渲染。

一、轉換函數實現

<?php
public function actionIndex() {
    // 1. 查詢數據
    $data = Tableone::model()->findAll([
        'limit' => 10,
    ]);

    // 2. AR 對象轉純數組(僅適用 findAll 多維數組)
    $return = array_map(function ($record) {
        $schema = [];
        $result = [];

        // 獲取表結構列名
        if (isset($record->tableSchema->columns)) {
            foreach ($record->tableSchema->columns as $k => $v) {
                $schema[] = $k;
            }
        }

        // 僅提取表字段對應的屬性值
        if (count($schema) > 0) {
            foreach ($schema as $k => $v) {
                $result[$v] = $record->attributes[$v];
            }
        }
        return $result;
    }, $data);

    // 3. 輸出驗證
    print_r($return);
}
?>

二、關鍵點解析

  1. $record->tableSchema->columns:Yii AR 內置表結構元數據,鍵為字段名;
  2. $record->attributes:包含所有屬性(含關聯、虛擬屬性),需按 $schema 過濾;
  3. array_map:函數式風格處理每條記錄,代碼簡潔;
  4. 局限: 僅適用 findAll 返回的多維數組;find 單對象需先包裝為單元素數組再處理。

三、進階方案:CArrayDataProvider 直接綁定 GridView

若需在 CGridView 顯示原生 SQL 查詢結果,無需轉 AR:

<?php
// Controller
$rawData = Yii::app()->db->createCommand('SELECT * FROM {{post}} WHERE id < 100')->queryAll();

$dataProvider = new CArrayDataProvider($rawData, [
    'id' => 'user',
    'sort' => ['attributes' => ['id', 'title', 'content']],
    'pagination' => ['pageSize' => 10],
]);

$this->render('gridview_array', ['dataProvider' => $dataProvider]);
?>
<!-- View -->
<?php $this->widget('zii.widgets.grid.CGridView', [
    'id' => 'somegrid',
    'dataProvider' => $dataProvider,
    'columns' => ['id', 'title', 'content'],
]); ?>

四、避坑指南

  • 關聯屬性不會自動載入: $record->attributes 不包含未聲明的關聯,需 with() 預載入;
  • 大數據集內存: findAll 全量載入,大表請用 CDbDataProvider + pagination 分頁;
  • Yii 2.0 異同: Yii2 用 ActiveRecord::findAll() 返回數組,asArray() 可直接返回純數組,無需手動轉換。

掌握 AR 轉數組技巧,能靈活應對 API 輸出、異步渲染、導出報表等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved