2016-06-21 88 views
0

我已經使用自定義操作設置了Yii2 REST API,並且一切正常。但是,我試圖做的是從API中返回一些數據,這些數據將包含由外鍵設置的數據庫關係。關係在那裏,他們實際上正常工作。下面是控制器的一個示例查詢:Yii2 REST API關係數據返回

$result = \app\models\Person::find()->joinWith('fKCountry', true) 
     ->where(..some condition..)->one(); 
控制器

不過,我可以,例如,撥打這樣的事情:

$result->fKCountry->name 

,它會顯示相應的名稱作爲關係工作中。目前爲止這樣好,但只要我返回從API客戶端收到的結果return $result;fkCountry就消失了,我無法訪問上面提到的名稱。唯一剩下的就是指向國家表的外鍵的價值。

我可以提供更多的代碼和信息,但我認爲這足以描述這個問題。我如何在返回時對來自聯接數據的信息進行編碼,以便API客戶端也可以訪問它?

+0

請顯示更多代碼 – Vitaly

回答

3

設置它這樣

public function actionYourAction() { 
    return new ActiveDataProvider([ 
     'query' => Person::find()->with('fKCountry'), // and the where() part, etc. 
    ]); 
} 

確保您的個人模式extraFields功能包括fKCountry。如果你還沒有實現extraFields功能還沒有,添加它:

public function extraFields() { 
    return ['fKCountry']; 
} 

,然後當你調用的URL確保您添加expand參數去告訴你要包括fkCountry數據的動作。所以像這樣:

/yourcontroller/your-action?expand=fKCountry 
+0

我實際上並沒有使用ActiveDataProvider,只是從find()函數得到結果,在這種情況下這應該是無關緊要的。我按照你的建議添加了extraField功能,奇怪的是,只要我調用one()函數,它就可以工作。所以如果我用('fKCountry') - >'Person :: find() - > where(...) - > one();'我在fkCountry信息的響應中得到額外的數組。但是,只要我將one()更改爲all(),這就是我需要的,額外的數據又會消失。任何想法爲什麼發生這種情況,以及如何解決它? – mmvsbg

+0

不知道如何在沒有添加ActiveDataProvider的情況下找回它,但是因爲結果傳遞給'toArray()'而導致它消失,並且它沒有看到展開設置,我認爲沒有使用ActiveDataProvider。但是,如果您確實添加了數據提供者,那麼它的確行得通? – jagsler

+0

是的,它與ActiveDataProvider一起工作,但並非沒有它。好的提示。儘管如此,應該有一個更簡單的方法來做到這一點,在我看來,這是太多的代碼,只是爲了使結果不會延遲加載數據。我很想擺脫URL中的GET參數。儘管如此,標記答案是正確的,因爲它完成了問題中提出的問題。 – mmvsbg

1

我設法解決上述問題。 使用ActiveDataProvider,我有3個更改在我的代碼,使其工作。

這正好控制器:

Model::find() 
->leftJoin('table_to_join', 'table1.id = table_to_join.table1_id') 
->select('table1.*, table_to_join.field_name as field_alias'); 

在該模型中,我介紹了一個新的屬性具有相同的名稱作爲上述別名:

public $field_alias; 

仍然在模型類,我修改fields()方法:

public function fields() 
{ 
    $fields = array_merge(parent::fields(), ['field_alias']); 
    return $fields; 
} 

這樣我的API爲我提供了來自加入字段的數據。