Yii2使用关系迭代dataprovider

时间:2016-01-29 22:57:30

标签: iterator yii2 dataprovider

我需要知道如何使用关系迭代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";
    }

}

从代码中的注释可以看出,获取make->描述字段的各种形式都不会产生结果。

1 个答案:

答案 0 :(得分:0)

获得的经验:始终检查错误。

我的代码是正确的。但是,数据并不是我的预期。在引发外键检查后,dba删除了一些品牌和型号。因此,$ data-> make。

因此我改变了行

$data->make->description

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