Yii2 итерирует поставщика данных с отношениями

Мне нужно знать, как перебирать поставщик данных Yii2 с отношениями.

У меня есть актив модели, который имеет отношение к другой модели Make.

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

В моем контроллере есть две функции: одна для рендеринга сетки, а другая для экспорта данных в 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->description не дают результата.


person crafter    schedule 29.01.2016    source источник
comment
Если вам нужно значение для этого поля, просто используйте $data->relationName->desired_field_name.   -  person Insane Skull    schedule 30.01.2016
comment
@InsaneSkull, я этого и ожидал. Однако, как вы можете видеть в моих комментариях, $data-›make-›description не работает. var_dump($data-›make) возвращает значение null, а $data-›make_id возвращает допустимое значение. Я разместил свою модель и отношения в вопросе. Если я получаю оборудование с помощью find, то $equipmentModel-›make-›description возвращает допустимое значение.   -  person crafter    schedule 30.01.2016


Ответы (1)


Извлеченный урок: всегда проверяйте наличие ошибок.

Мой код был правильным. Однако данные оказались не такими, как я ожидал. Администрация базы данных удалила некоторые марки и модели после включения проверки внешнего ключа. Поэтому $data->make.

Поэтому я изменил строку

$data->make->description

to

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