Yii restful API, как изменить возвращаемые результаты из модели

0

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

{
 "id": 1,
 "user_id": 1,
 "description": "This is a summary of article 1",
 "status": 2,
 "type": 1,
 "created_at": 1426210780,
 "updated_at": 1426365319
}

Значение для "type" равно "1" в db, но я хочу сохранить все возможные значения "type" в другой таблице следующим образом:

 1 : Red
 2 : Blue
 3 : Green

И затем я хочу, чтобы JSON возвращался через мой API, чтобы содержать "type": "red" вместо "type": 1. Я предполагаю, что мне нужно переопределить что-то в моей модели, но я не могу понять, что переопределить или с чем.

Я рад прочитать учебники или документацию, но я такой начинающий, что не уверен, какие условия искать. Спасибо за вашу помощь!

Теги:
rest
yii2
yii

2 ответа

1

@Burrito ответ предоставил документацию, но я хочу дать полное решение для других поисковиков:

Во-первых, мне нужно было создать модель для "Тип".

Во-вторых, мне нужно было объявить отношения между "Отчет" (моя основная модель) и "Тип", как это (в моей модели отчета):

public function getType()
{
    return $this->hasOne(Type::className(), ['id' => 'type']);
}

(Я не уверен, нужен ли этот шаг, но документация делает это необходимым.)

В-третьих, я создал getTypeName (в модели Report), чтобы получить имя типа на основе ID:

public function getTypeName($type = null)
{
    return Type::findOne($type)->name;
}

Наконец, в моем apiController я изменил функцию, которую я использую, чтобы все записи включали цикл для каждой записи, называемой getTypeName:

protected function findAllReports()
{
    // get all reports
    $reports = Report::find()
                ->asArray()
                ->all();

    if( $reports ){
        $i = 0; 
        // loop through each report
        foreach($reports as $report){
            $model = new Report();
            // add a new key/value pair to each report array, populate with getTypeName and pass the type ID to it as a parameter
            $reports[$i]['typeName'] = $model->getTypeName($reports[$i]['type']);
            $i++;
        }
        return $reports;
    } else {
       // error or no results
    }
}

Для справки, другая рутина, необходимая здесь, - это действие, к которому обращается API, который вызывает findAllReports():

public function actionList()
{
    $reports=$this->findAllReports();
    $this->setHeader(200);
    echo json_encode(array('status'=>1,'data'=>$reports),JSON_PRETTY_PRINT);
}

Наконец, теперь, если я назвал [url]/api/list, я получаю массив отчетов, включая typeName.

1

Посмотрите модели и их отношения с другими моделями, это позволит вам получить необходимую информацию.

http://www.yiiframework.com/doc/guide/1.1/en/database.arr

Как только отношения будут работать правильно, вы сможете получить цвет от исходной модели.

Хотя это из более ранней версии Yii, это может помочь вам понять, как модели будут взаимодействовать, а также http://www.yiiframework.com/wiki/285/accessing-data-in-a-join-table-with-the -модель о связанной/

  • 0
    Спасибо, эта информация полезна. Я немного опасаюсь того, что не знаю, что отличается для 2.0, но я полагаю, что на 2.0 пока нет большого количества документации и учебных пособий.
  • 0
    Хорошо, я следовал за этой документацией и фактически нашел документацию 2.0, также. Я настроил модели и отношения, и теперь я могу успешно использовать getTypeName в представлении и отображать «красный» в качестве типа. Но API не использует представление, оно (я думаю) использует метод findOne () и возвращает результаты обратно. Там нет места для меня, чтобы положить getTypeName в. Как мне изменить функцию по умолчанию (findOne?), Чтобы при извлечении «отчета» через API я не возвращал «type» как 1, а вместо «type» как «red»? Спасибо за вашу помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню