Yii2扩展和字段不与ActiveDataProvider一起工作

e0bqpujr  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(123)

我无法使用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
但在所有情况下,无论我是否指定字段或扩展参数,它都返回相同的数据。
谁能告诉我我做错了什么?

yuvru6vn

yuvru6vn1#

我设法通过调用rest控制器的serializeData方法使其工作。如果在获得数据后对dataModels调用serializeData方法,那么在响应JSON中也会获得extraFields数据。下面是它的工作方式:

$data=ActivityPredecessor::find()->where(['activity_id'=>$activity_id])->all();
    $data=$this->serializeData($data);//This line will cause extra fields to be returned in response  as well and will make fields and expand query params functional. Without this line only current model's primary fields will be returned.

现在您可以执行以下操作:

return $data;

希望有一天它能帮助到别人。

相关问题