Yii2 расширяется, и поля не работают с ActiveDataProvider - PullRequest
0 голосов
/ 14 июля 2020

Я не могу вернуть выбранные поля из моей модели с помощью ActiveDataProvider для моей конечной точки REST API.

Вот мой код контроллера:

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, она не включается в ответ.

Я знаю Я могу переопределить функцию полей, чтобы включить ее следующим образом:

public function fields()
    {
       $fields=parent::fields();
       array_push($fields,'activity');
       return $fields;
    }

Но если я это сделаю, ответ всегда будет включать activity модель, которая мне не нужна. Я хочу иметь возможность получать различные поля на основе полей и расширять параметры в URL-адресе следующим образом:

http://localhost: 88 / предшественники? Fields = предшественник_id (Получать только predcessor_id в ответ)

http://localhost: 88 / предшественники? Fields = predcessor_id & expand = activity (Получить только predcessor_id из текущей модели, но также включить связанную модель activity в ответ)

Но во всех случаях он возвращает одни и те же данные независимо от того, указываю я поля или расширять параметры или нет. Короче говоря, расширение и поля вообще не работают.

Кто-нибудь, пожалуйста, скажите мне, что я делаю не так?

1 Ответ

0 голосов
/ 14 июля 2020

Мне удалось заставить его работать, вызвав метод serializeData контроллера отдыха. Если после получения данных вы вызываете метод serializeData в dataModels, вы также получаете данные extraFields в ответ JSON. Вот как это будет работать:

    $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;

Надеюсь, что когда-нибудь это поможет кому-то.

...