【问题标题】:Yii restful API, how to modify return results from modelYii RESTful API,如何修改模型返回的结果
【发布时间】:2015-03-25 00:18:24
【问题描述】:

我跟着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
}

数据库中'type'的值是'1',但我想将'type'的所有可能值存储在另一个表中,如下所示:

 1 : Red
 2 : Blue
 3 : Green

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

我很乐意通读教程或文档,但我是这方面的初学者,因此我不确定要搜索哪些术语。感谢您的帮助!

【问题讨论】:

    标签: php api rest yii yii2


    【解决方案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/

    【讨论】:

    • 谢谢,这些信息很有帮助。我有点担心不知道 2.0 有什么不同,但我想 2.0 上还没有大量的文档和教程。
    • 好的,我已经按照那个文档,实际上也找到了 2.0 文档。我已经设置了模型和关系,现在可以在视图中成功使用 getTypeName 并将“红色”显示为类型。但是 API 没有使用视图,它(我认为)使用 findOne() 方法并将结果回显。我没有地方可以放入 getTypeName。如何修改默认函数(findOne?),所以当我通过 API 提取“报告”时,我不会将“类型”返回为 1,而是将“类型”返回为“红色”?感谢您的帮助!
    【解决方案2】:

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

    首先,我需要为“类型”设置一个模型。

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

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多