我无法使用REST API端点的ActiveDataProvider从模型中返回选定字段。
下面是我的控制器代码:
return new ActiveDataProvider([
'query' => ActivityPredecessor::find()->where(['activity_id'=>$activity_id])
]);
我的ActivityPredecessor与活动表的关系如下:
public function getCurrentActivity()
{
return $this->hasOne(Activity::className(), ['activity_id' => 'activity_id']);
}
下面是我的外场函数:
public function extraFields() {
return ['activity'];
}
但是当我以JSON格式从控制器返回响应时,它不包含相关的“活动”数据,只包含当前模型(ActivityPredecessor)的字段。例如:
{
"predecessor_id": 1,
"activity_id": 98132,
"created_at": "2020-07-14 03:17:06.04294"
}
当我打印dataProvider时,它确实包含相关的activity
模型,但当我以JSON形式返回它时,它不包含在响应中。
我知道我可以重写fields函数来包含它,如下所示:
public function fields()
{
$fields=parent::fields();
array_push($fields,'activity');
return $fields;
}
但如果我这样做,那么响应总是包括activity
模型,我不想要的。我希望能够获取不同的字段为基础的字段和扩展参数在URL中,像这样:
http://localhost:88/predecessors?fields=predecessor_id(仅获取响应中的predecessor_id)
http://localhost:88/predecessors?fields=predecessor_id&expand=activity(仅从当前模型中获取predecessor_id,但在响应中还包括相关模型activity
)
但在所有情况下,无论我是否指定字段或扩展参数,它都返回相同的数据。
谁能告诉我我做错了什么?
1条答案
按热度按时间yuvru6vn1#
我设法通过调用rest控制器的serializeData方法使其工作。如果在获得数据后对dataModels调用serializeData方法,那么在响应JSON中也会获得extraFields数据。下面是它的工作方式:
现在您可以执行以下操作:
希望有一天它能帮助到别人。