Yii restful API,如何修改模型的返回结果

时间:2015-03-25 00:18:25

标签: php api rest yii yii2

我按照this tutorial设置基于Yii框架的后端服务器,然后this tutorial设置我的API,一切正常。 但我不确定如何完成下一步: 我现在的返回数组是拉出如下所示的记录:

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

db中'type'的值为'1',但是我希望将'type'的所有可能值存储在另一个表中,如下所示:

 1 : Red
 2 : Blue
 3 : Green

然后我希望通过我的API返回的JSON包含“type”:'red'而不是“type”:1。我假设我需要覆盖模型中的某些内容,但我无法弄清楚要覆盖什么或使用什么。

我很高兴阅读教程或文档,但我是初学者,我不确定要搜索的术语。谢谢你的帮助!

2 个答案:

答案 0 :(得分: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-related-models/

答案 1 :(得分:1)

@Burrito的回复提供了文档,但我想为其他搜索者提供完整的解决方案:

首先,我需要为'Type'设置一个模型。

其次,我需要声明“报告”(我的主要模型)和“类型”之间的关系(在我的报告模型中):

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

(我不确定该步骤是否必要,但documentation似乎有必要。)

第三,我创建了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。