Могу ли я объединить ArrayDataProvider и ActiveDataProvider?

С помощью Yii2 Мне нужно предоставить DataProvider с конкретными данными.
Проблема в том, что мне нужно создать единый DataProvider с массивом данных и данных из таблицы в базе данных.

Поэтому я думаю, что я должен смешать ArrayDataProvider и ActiveDataProvider, Я не знаю, если Yii2 предлагает инструменты для этой ситуации или я должен создать свой собственный DataProvider от BaseDataProvider,

Я не могу опубликовать код, потому что это вопрос знаний.

3

Решение

Согласно вашему описанию, вы можете попытаться получить данные из БД в виде массива, затем объединить их с другим имеющимся массивом, а затем поместить все это в 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

Другие решения

Да, подход Аспеда будут Работа. Вот рабочий пример, в функции Model — в этом случае я объединяю 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.

Функция модели затем вызывается виджетом GridView в представлении:

echo GridView::widget([
'dataProvider' => $model->getActivityCombined(),
'columns' => [
'counter_reset',
'impress_town',
'impress_county',
'impress_listing',
'clicks_web',
'clicks_facebook',
'clicks_twitter',
],
]);
0