是的,Asped 的方法会奏效。这是一个工作示例,在模型函数中 - 在这种情况下,我正在合并 SqlDataProvider 和 ActiveDataProvider,以合并来自两个表的数据,但同样的原则适用于合并 DataProviders 的任何其他组合(是的,我确实测试了其他组合):
/**
* @return ArrayDataProvider;
*
* Combine current Activity with Archive:
*/
public function getActivityCombined() {
# Current:
$dataProviderActivityCurrent = new SqlDataProvider([
'sql' => 'SELECT listing_id, counter_reset, impress_town, impress_county,
impress_listing, clicks_web, clicks_facebook, clicks_twitter
FROM listing WHERE listing_id = ' . $this->listing_id,
]);
# Archive:
$query = ActivityArchive::find();
$dataProviderActivityArchive = new ActiveDataProvider([
'query' => $query,
]);
$dataProviderActivityArchive->query->andWhere(['listing_id' => $this->listing_id]);
# Merge:
$dataMerge = array_merge($dataProviderActivityCurrent->getModels(), $dataProviderActivityArchive->getModels());
$dataProviderActivity = new ArrayDataProvider([
'allModels' => $dataMerge
]);
# Return combined:
return $dataProviderActivity;
}
当然,您需要包含三种 DataProvider 类型的 use 语句。
模型函数随后由视图中的 GridView 小部件调用:
echo GridView::widget([
'dataProvider' => $model->getActivityCombined(),
'columns' => [
'counter_reset',
'impress_town',
'impress_county',
'impress_listing',
'clicks_web',
'clicks_facebook',
'clicks_twitter',
],
]);