2015-05-05 99 views
6

型號搜索連接值:yii2 GridView控件使用的hasMany retionship

$query = Countries::find()->joinWith(['states']); 
$dataProvider = new ActiveDataProvider([ 
    'query' => $query,   
]);   

$dataProvider->setSort([ 
    'defaultOrder' => ['doc_date'=>SORT_DESC], 
]); 

if (!($this->load($params) && $this->validate())) {   
    return $dataProvider; 
} 

型號:

public function getStates() 
{ 
    return $this->hasMany(States::className(), ['state_id' => 'state_id']); 
} 

我需要當我使用導致像

Id  Country  State 
1  India  State 1 
2  India  State 2 
3  India  State 3 
4  USA   USA State1 
5  USA   USA State2 

gridview我得到如下結果

Id  Country  State 
1  India  State 1 
4  USA   USA State1 

請給出解決方案來解決這個問題。

回答

2

你看到的是預期的行爲:通常你不希望你的ActiveRecord查詢包含重複的主記錄,所以Yii會過濾掉由JOIN引起的任何重複。你可以看到這裏定義的行爲:https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveQuery.php#L220

因爲你想要的基本上是顯示由JOIN生成的原始結果(對於Country和State的每個組合都是一行),我認爲最實用的解決方案將使用SqlDataProvider而不是ActiveDataProvider

這應返回正是你想要的:

$query = Countries::find()->joinWith(['states'], false)->select(*); 

$dataProvider = new SqlDataProvider([ 
    'query' => $query->createCommand()->getRawSql(),   
]);   
1

通過laszlovl給出的答案做工不錯,但還需要通過「SQL」改變「查詢」的鍵值如下圖所示:

$query = Countries::find()->joinWith(['states'], false)->select(*); 

$dataProvider = new SqlDataProvider([ 
    'sql' => $query->createCommand()->getRawSql(),   
]); 

Yii 2 Docs我們可以發現$ sql屬性獲取用於獲取數據行的SQL語句。此屬性的默認值是「空」

0

如果明確使用select()方法指定所選列,可以達到同樣的效果,而不會與原始的SQL查詢搞亂

$query->select(['countries.*','states.*']);