У меня возникла проблема отображения данных из двух таблиц в формат 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 ''; } }