我可以合并 ArrayDataProvider 和 ActiveDataProvider 吗?
Can I merge a ArrayDataProvider and ActiveDataProvider?
使用 Yii2
我需要提供一个包含特定数据的 DataProvider
。
问题是我需要用数据库中的 table 中的数组数据和数据创建一个 DataProvider
。
因此,我认为我应该混合使用 ArrayDataProvider
和 ActiveDataProvider
。我不知道 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',
],
]);
使用 Yii2
我需要提供一个包含特定数据的 DataProvider
。
问题是我需要用数据库中的 table 中的数组数据和数据创建一个 DataProvider
。
因此,我认为我应该混合使用 ArrayDataProvider
和 ActiveDataProvider
。我不知道 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',
],
]);