как отображать данные отношения в формате json из двух таблиц в yii2 restful api

У меня возникла проблема отображения данных из двух таблиц в формат JSON и работы с yii2 restful api.

это моя база данных структуры:

TABLE `volunteer`( `volunteer_id` int(11) NOT NULL auto_increment, `state_id` int(11) null TABLE `state`( `state_id` int(11) NOT NULL auto_increment, `state` varchar(225) null 

volunteerController.php

 public $modelClass = 'app\models\Volunteer'; public function behaviors() { return ArrayHelper::merge(parent::behaviors(),[ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['post'], ], ], ]); } 

конфиг / web.php

 'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => ['volunteer','state','post']], ], 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 'cookieValidationKey' => 'QMoK0GQoN7_VViTXxPdTISiOrITBI4Gy', 'parsers' => [ 'application/json' => 'yii\web\JsonParser', ], ], 

это результат в формате JSON:

 [ { "volunteer_id": 1, "country_id": 1, "state_id": 12, } ] 

так что результат не то, что я хочу. Я хочу, чтобы state_id возвращал данные состояния из состояния таблицы, что означает состояние: Нью-Йорк . Не возвращать state_id. Как решить эту проблему ?

Это можно сделать с помощью переопределения fields() :

 public function fields() { return [ 'volunteer_id', 'country_id', 'state' => function ($model) { return $model->state->name; // Return related model property, correct according to your structure }, ]; } 

Кроме того, вы можете с нетерпением загрузить это отношение в prepareDataProvider() используя with() .

Официальные документы:

  • Переопределение полей ()
  • Настройка действий
 public function fields(){ return [ 'volunteer_id', 'country_id', 'state' => function ($model) { return $model->setOtherAttr($model->state_id); }, 'other_attr1', 'other_attr2', ]; } public function setOtherAttr($state_id){ $state = State::find()->where(['state_id'=>$state_id])->one(); $this->other_attr1 = $state->other_attr1; $this->other_attr2 = $state->other_attr2; return $state->state; } 

Попробуйте следующий код:

 public function setOtherAttr($state_id){ if (($model = State::find()->where(['state_id'=>$state_id])->all()) !== null) { return $model; } else { return ''; } }