我可以合并 ArrayDataProvider 和 ActiveDataProvider 吗?

Can I merge a ArrayDataProvider and ActiveDataProvider?

使用 Yii2 我需要提供一个包含特定数据的 DataProvider。 问题是我需要用数据库中的 table 中的数组数据和数据创建一个 DataProvider

因此,我认为我应该混合使用 ArrayDataProviderActiveDataProvider。我不知道 Yii2 是否提供针对这种情况的工具,或者我应该从 BaseDataProvider.

创建自己的 DataProvider

我不能 post 一些代码,因为这是一个知识问题。

根据您的描述,您可以尝试从数据库中获取数据作为数组,然后将其与您拥有的其他数组合并,然后将其全部放入 ArrayDataProvider

试试这个(未测试):

$dbData = Model::find()->all(); //load your data from DB
$arrayData = [...]; //your other data as an array

// do the merge, with ArrayHelper::merge() or somehow manually

$data = ArrayHelper::merge($dbData, $arrayData);
$provider = new ArrayDataProvider([
'allModels' => $data
]);

是的,Asped 的方法 奏效。这是一个模型函数中的工作示例 - 在这种情况下,我合并了一个 SqlDataProvider 和一个 ActiveDataProvider,以合并来自两个表的数据,但同样的原则适用于合并任何其他 DataProvider 组合(是的,我确实测试了其他组合):

/**
 * @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',
    ],
]);