2015-03-25 23 views
0

我跟着this tutorial設置我的後端服務器,基於Yii框架,然後this tutorial來設置我的API,一切工作正常。 但我不知道如何完成下一個步驟: 我返回數組現在是拉動看起來像這樣的記錄: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 
} 

的「類型」的值爲「1」在數據庫中,但我想「類型」的所有可能的值存儲在另一個表是這樣的:

1 : Red 
2 : Blue 
3 : Green 

然後,我要的JSON通過我的API返回包含「類型」:「紅色」,而不是「類型」:1 。我想我需要重寫我的模型中的某些內容,但我無法弄清楚要重寫什麼或使用什麼。

我很高興通讀教程或文檔,但我是這樣的初學者,我不知道要搜索什麼條款。謝謝你的幫助!

回答

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/

+0

謝謝,這個信息很有幫助。我對於不知道2.0有什麼不同有點小心,但是我想在2.0中還沒有很多文檔和教程。 – 2015-03-26 00:35:55

+0

好的,我遵循該文檔,實際上也找到了2.0文檔。我已經建立了模型和關係,現在我可以在視圖中成功使用getTypeName,並顯示「紅色」作爲類型。 但API沒有使用視圖,它是(我認爲)使用findOne()方法並回顯結果。我沒有把getTypeName放入的地方。我如何修改默認函數(findOne?),所以當我通過API拉取'報告'時,我不會將'type'返回爲1,而是將'type'返回爲'red'? 感謝您的幫助! – 2015-03-26 03:32:11

1

@捲餅的響應提供的文件,但我想給完整的解決方案的其它搜:

首先,我需要爲'Type'設置一個模型。

其次,我需要申報「報告」(我的主要模式)和「類型」這樣的(在我的報告模型)之間的關係:

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

(我不知道如果這一步,是必要的,但documentation使得它看起來必需)

第三,我創建getTypeName(在報表模型),要獲得類型的基礎上,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 /列表中,我得到的報告陣列,包括類型名稱。