Yes, Asped's approach will work. Here's a working example, in a Model function - in this case I'm merging a SqlDataProvider and an ActiveDataProvider, to merge data from two tables, but the same principle would apply to merging any other combination of DataProviders (yes, I did test the other combinations):
/**
* @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;
}
Of course you'll need to include use statements for the three DataProvider types.
The model function is then called by a GridView widget in a view:
echo GridView::widget([
'dataProvider' => $model->getActivityCombined(),
'columns' => [
'counter_reset',
'impress_town',
'impress_county',
'impress_listing',
'clicks_web',
'clicks_facebook',
'clicks_twitter',
],
]);