【发布时间】: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