【问题标题】:Yii2 iterate dataprovider with relationsYii2 使用关系迭代数据提供者
【发布时间】:2025-12-28 07:10:04
【问题描述】:

我需要知道如何通过关系遍历 Yii2 数据提供者。

我有一个与另一个模型 Make 有关系的模型资产。

class Equipment extends \yii\db\ActiveRecord
{
    // ...
    public function getMake() {
        return $this->hasOne(Make::className(), ['make_id' => 'make_id']);
    }
}

在我的控制器中,我有 2 个函数,一个用于渲染网格,另一个用于将数据导出到 CSV 文件。

public function actionEquipment()
{
    $searchModel = new EquipmentSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    // Store the search model in session
    Yii::$app->session->set('exportEquipmentModel', $searchModel);;

    // Render grid
    return $this->render('equipment', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

public function actionExportequipment()
{
     header('Content-type: text/csv');
     header('Content-Disposition: attachment; filename="equipment_report-' . date('YmdHi') .'.csv"');

     $searchModel = new EquipmentSearch();
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    // Use the search model from session, or get all        
    if(\Yii::$app->session->get('exportEquipmentModel')) {
        $searchModel = Yii::$app->session->get('exportEquipmentModel');

        $dataProvider = $searchModel->search(false);
        $dataProvider->setPagination(false);
    }

    // csv header
    $columns =[
        'serial_number',
        'Make',
        'Model',
    ];
    echo  implode(",", $columns) . " \r\n";

    // csv data
    foreach ($dataProvider->getModels() as $data) {

         $row =[
             $data['serial_number'],
             // TODO: I need to resolve the relation here
             $data['make_id']                     // Works
             // $data->make_id                    // Works
             // $data->make->description          // Does not work
             // $data['make_id']['description'],  // Does not work
             $data['model_id']
         ];

         echo  implode(",", $row) . " \r\n";
    }

}

从代码中的cmets可以看出,各种获取make->description字段的方式都没有产生结果。

【问题讨论】:

  • 如果您想要该字段的值,只需使用$data->relationName->desired_field_name
  • @InsaneSkull,这正是我的预期。但是,正如您在我的 cmets 中看到的那样,$data->make->description 不起作用。 var_dump($data->make) 返回 null,而 $data->make_id 返回有效值。我在问题中发布了我的模型和关系。如果我使用 find 获取设备,则 $equipmentModel->make->description 返回一个有效值。

标签: iterator yii2 dataprovider


【解决方案1】:

经验教训:始终检查错误。

我的代码是正确的。然而,数据并不是我所期望的。 dba 在启动外键检查后删除了一些品牌和型号。因此,$data->make.

因此我改行了

$data->make->description

!empty($data->make)?$data->make->description:'Not Set',

【讨论】: