Использование провайдеров SqlDataProvider, ArrayDataProvider и SqlDataProvider в Yii 2.x

Yii 2 содержит 3 типа провайдера данных:

  • SqlDataProvider  использует для своей работы sql запросы.
  • ActiveDataProvider — работает с ActiveQuery и, как правило, возвращает массив объектов ActiveRecord моделей со всеми связями. 
  • ArrayDataProvider строится на основе массива. Довольно удобный способ использования, когда у вас много связанных моделей

Все 3 типа провайдера данных работают аналогично и взаимозаменяемы. Рассмотрим пример и по очереди будем использовать эти провайдеры. Предположим у нас есть модель News (новости), содержащая 4 поля title (Заголовок новости), text (Текст новости), author (автор новости) и datecreate (Дата создания новости). Выведем ленту новостей на сайт с использованием провайдеров данных. 

SqlDataProvider

// подключаем библиотеки
use Yii;
use app\models\News;
use yii\data\SqlDataProvider;

public function actionIndex()
{
// подсчитываем количество опубликованных новостей
$totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM news WHERE publication=:publication', [':publication' => 1])->queryScalar();
// объявляем класс SqlDataProvider
        $dataProvider = new SqlDataProvider([
            'sql' => 'SELECT * FROM news WHERE publication=:publication', //запрос на выборку новостей
            'params' => [':publication' => 1], // условие публикации
            'totalCount' => $totalCount, // количество новостей
             // сортировка
            'sort' => [
                'attributes' => [
                    'header' => [
                        'asc' => ['header' => SORT_ASC], // от А до Я
                        'desc' => ['header' => SORT_DESC], // от Я до А
                        'default' => SORT_DESC, // сортировка по умолчанию
                        'label' => 'Заголовок', // название
                    ],
                    'author' => [
                        'asc' => ['author' => SORT_ASC],
                        'desc' => ['author' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'Автор',
                    ],
                    'text' => [
                        'asc' => ['text' => SORT_ASC],
                        'desc' => ['text' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'Новость',
                    ],
                    'datecreate' => [
                        'asc' => ['datecreate' => SORT_ASC],
                        'desc' => ['datecreate' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'Дата новости',
                    ],
                ],
            ],
            'pagination' => [ // постраничная разбивка
                'pageSize' => 10, // 10 новостей на странице
            ],
        ]);
// передача экземпляра класса в представление        
return $this->render('index',['dataProvider' =>$dataProvider]);
}

Для вывода используем виджет GridView

// подключаем библиотеку
use yii\grid\GridView;

echo GridView::widget([
        // полученные данные
       'dataProvider' => $dataProvider,
       // Отображать 5 страниц
       'pager' => ['maxButtonCount' => 5],
      // колонки с данными 
      'columns' => [
           ['class' => 'yii\grid\SerialColumn'],
           [
               'label' =>"Заголовок", // название столбца
               'attribute' => 'title', // атрибут 
               'value'=>function($data){return $data["title"];} // объявлена анонимная функция и получен элемент массива (заголовок)
           ],
           [
            'label' => 'Дата создания',
            'attribute' => 'datecreate',
            'value' => function($data) { return date("d.m.Y H:i", $data["datecreate"]); },
            ],
            [
            'label' => 'Текст новости',
            'attribute' => 'text',
            'value' => function($data) { return  $data["text"]; },
            ],
              [
            'label' => 'Автор новости',
            'attribute' => 'author',
            'value' => function($data) { return  $data["author"]; },
            ],
           ['class' => 'yii\grid\ActionColumn'],
       ],
   ]); 

ActiveDataProvider

// подключаем библиотеки
use Yii;
use app\models\News;
use yii\data\ActiveDataProvider;

public function actionIndex()
{
// объявляем класс ActiveDataProvider
$dataProvider = new ActiveDataProvider([
    'query' => News::find()->where(['publication' => 1]), // Запрос на выборку опубликованных новостей
        'sort' => [ // сортировка по умолчанию
           'defaultOrder' => ['title' => SORT_DESC, 'datecreate' => SORT_DESC, 'author' => SORT_DESC, 'text' => SORT_DESC, ],
         ],
         'pagination' => [ // постраничная разбивка
             'pageSize' => 10, // 10 новостей на странице
          ],
]);
// передача экземпляра класса в представление        
return $this->render('index',['dataProvider' =>$dataProvider]);
}

Для вывода используем виджет GridView

// подключаем библиотеку
use yii\grid\GridView;

echo GridView::widget([
        // полученные данные
       'dataProvider' => $dataProvider,
       // Отображать 5 страниц
       'pager' => ['maxButtonCount' => 5],
      // колонки с данными 
      'columns' => [
           ['class' => 'yii\grid\SerialColumn'],
           [
               'label' =>"Заголовок", // название столбца
               'attribute' => 'title', // атрибут 
               'value'=>function($data){return $data->title;} // объявлена анонимная функция и получен результат
           ],
           [
            'label' => 'Дата создания',
            'attribute' => 'datecreate',
            'value' => function($data) { return date("d.m.Y H:i", $data->datecreate); },
            ],
            [
            'label' => 'Текст новости',
            'attribute' => 'text',
            'value' => function($data) { return  $data->text; },
            ],
              [
            'label' => 'Автор новости',
            'attribute' => 'author',
            'value' => function($data) { return  $data->author; },
            ],
           ['class' => 'yii\grid\ActionColumn'],
       ],
   ]); 

ArrayDataProvider

// подключаем библиотеки
use Yii;
use yii\data\ArrayDataProvider;
use yii\db\Query;

public function actionIndex() { // подключаем построитель запросов
$query = new Query;
// подключаем ArrayDataProvider $dataProvider = new ArrayDataProvider([ 'allModels' => $query->from('news')->where(['publication' => 1])->all(), // запрос на выборку новостей 'sort' => [ // подключаем сортировку 'attributes' => ['title', 'datecreater', 'author', 'text'], ], 'pagination' => [ //постраничная разбивка 'pageSize' => 10, // 10 новостей на странице ], ]); return $this->render('index',['dataProvider' =>$dataProvider]);


Для вывода используем виджет GridView

// подключаем библиотеку
use yii\grid\GridView;

echo GridView::widget([
        // полученные данные
       'dataProvider' => $dataProvider,
       // Отображать 5 страниц
       'pager' => ['maxButtonCount' => 5],
      // колонки с данными 
      'columns' => [
           ['class' => 'yii\grid\SerialColumn'],
           [
               'label' =>"Заголовок", // название столбца
               'attribute' => 'title', // атрибут 
               'value'=>function($data){return $data["title"];} // объявлена анонимная функция и получен элемент массива (заголовок)
           ],
           [
            'label' => 'Дата создания',
            'attribute' => 'datecreate',
            'value' => function($data) { return date("d.m.Y H:i", $data["datecreate"]); },
            ],
            [
            'label' => 'Текст новости',
            'attribute' => 'text',
            'value' => function($data) { return  $data["text"]; },
            ],
              [
            'label' => 'Автор новости',
            'attribute' => 'author',
            'value' => function($data) { return  $data["author"]; },
            ],
           ['class' => 'yii\grid\ActionColumn'],
       ],
   ]);