【问题标题】:Can I merge a ArrayDataProvider and ActiveDataProvider?我可以合并 ArrayDataProvider 和 ActiveDataProvider 吗?
【发布时间】:2015-10-02 09:35:04
【问题描述】:

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

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

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

【问题讨论】:

  • 您好,请发布一些代码并添加有关您希望如何“混合”这 2 个数据提供者的更多信息。您想向数据库中的数据添加更多“列”吗?或者你想用数组添加数据库的所有行?很高兴看到数据样本
  • @Asped 我需要表中的数据,并且需要与具有相同结构的数据合并,但我不想将其存储在数据库中。问题是我需要像一个数据提供者一样管理所有数据。有点奇怪的问题。

标签: php yii2 dataprovider


【解决方案1】:

根据您的描述,您可以尝试以数组的形式从数据库中获取数据,然后将其与您拥有的其他数组合并,然后将其全部放入 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
]);

【讨论】:

    【解决方案2】:

    是的,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',
        ],
    ]);
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2012-09-04
      • 2016-04-13
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2020-10-08
      相关资源
      最近更新 更多