Учебники

Yii — Поставщики данных

Yii предоставляет набор классов поставщиков данных, которые инкапсулируют нумерацию страниц и сортировку. Поставщик данных реализует yii \ data \ DataProviderInterface. Он поддерживает извлечение отсортированных и разбитых на страницы данных. Поставщики данных обычно работают с виджетами данных.

Yii включает в себя —

  • ActiveDataProvider — использует yii \ db \ ActiveQuery или yii \ db \ Query для запроса данных из баз данных.

  • SqlDataProviderвыполняет SQL и возвращает данные в виде массивов.

  • ArrayDataProvider — принимает большой массив и возвращает его фрагмент.

ActiveDataProvider — использует yii \ db \ ActiveQuery или yii \ db \ Query для запроса данных из баз данных.

SqlDataProviderвыполняет SQL и возвращает данные в виде массивов.

ArrayDataProvider — принимает большой массив и возвращает его фрагмент.

Вы определяете поведение сортировки и разбивки на страницы поставщика данных, настраивая его свойства разбивки на страницы и сортировки . Виджеты данных, такие как yii \ grid \ GridView , имеют свойство dataProvider , которое принимает экземпляр поставщика данных и отображает данные на экране.

Подготовка БД

Шаг 1 — Создайте новую базу данных. База данных может быть подготовлена ​​следующими двумя способами.

  • В терминале запустите mysql -u root –p .

  • Создать новую базу данных с помощью CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

В терминале запустите mysql -u root –p .

Создать новую базу данных с помощью CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Шаг 2 — Настройте соединение с базой данных в файле config / db.php . Следующая конфигурация предназначена для системы, используемой в настоящее время.

<?php
   return [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host = localhost;dbname = helloworld',
      'username' => 'vladimir',
      'password' => '12345',
      'charset' => 'utf8',
   ];
?>

Шаг 3 — Внутри корневой папки запустите ./yii migrate / create test_table . Эта команда создаст миграцию базы данных для управления нашей БД. Файл миграции должен появиться в папке миграций корня проекта.

Шаг 4. Измените файл миграции (в данном случае m160106_163154_test_table.php ).

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160106_163154_test_table extends Migration {
      public function safeUp() {
         $this->createTable("user", [
            "id" => Schema::TYPE_PK,
            "name" => Schema::TYPE_STRING,
            "email" => Schema::TYPE_STRING,
         ]);
         $this->batchInsert("user", ["name", "email"], [
            ["User1", "user1@gmail.com"],
            ["User2", "user2@gmail.com"],
            ["User3", "user3@gmail.com"],
            ["User4", "user4@gmail.com"],
            ["User5", "user5@gmail.com"],
            ["User6", "user6@gmail.com"],
            ["User7", "user7@gmail.com"],
            ["User8", "user8@gmail.com"],
            ["User9", "user9@gmail.com"],
            ["User10", "user10@gmail.com"],
            ["User11", "user11@gmail.com"],
         ]);
      }
      public function safeDown() {
         $this->dropTable('user');
      }
   }
?>

Вышеуказанная миграция создает пользовательскую таблицу со следующими полями: id, name и email. Также добавлено несколько демо-пользователей.

Шаг 5 — Внутри проекта запустите ./yii Миграция, чтобы применить миграцию к базе данных.

Шаг 6 — Теперь нам нужно создать модель для нашей пользовательской таблицы. Для простоты мы собираемся использовать инструмент генерации кода Gii . Откройте этот URL: http: // localhost: 8080 / index.php? R = gii . Затем нажмите кнопку «Пуск» под заголовком «Генератор моделей». Заполните Имя таблицы («пользователь») и Класс модели («MyUser»), нажмите кнопку «Предварительный просмотр» и, наконец, нажмите кнопку «Создать».

Создать кнопку

Модель MyUser должна появиться в каталоге моделей.

Активный поставщик данных

Шаг 1 — Создайте функцию с именем actionDataProvider внутри SiteController .

public function actionDataProvider(){
   $query = MyUser::find();
   $provider = new ActiveDataProvider([
      'query' => $query,
      'pagination' => [
         'pageSize' => 2,
      ],
   ]);
   // returns an array of users objects
   $users = $provider->getModels();
   var_dump($users);
}

В приведенном выше коде мы определяем экземпляр класса ActiveDataProvider и отображаем пользователей с первой страницы. Класс yii \ data \ ActiveDataProvider использует прикладной компонент БД в качестве соединения с БД.

Шаг 2 — Если вы введете адрес локального хоста http: // localhost: 8080 / index.php? R = site / dataprovider , вы увидите следующий вывод.

Активный поставщик данных

Поставщик данных SQL

Класс yii \ data \ SqlDataProvider работает с необработанными операторами SQL.

Шаг 1. Измените метод actionDataProvider следующим образом.

public function actionDataProvider() {
   $count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')->queryScalar();
   $provider = new SqlDataProvider([
      'sql' => 'SELECT * FROM user',
      'totalCount' => $count,
      'pagination' => [
         'pageSize' => 5,
      ],
      'sort' => [
         'attributes' => [
            'id',
            'name',
            'email',
         ],
      ],
   ]);
   // returns an array of data rows
   $users = $provider->getModels();
   var_dump($users);
}

Шаг 2 — Введите http: // localhost: 8080 / index.php? R = site / data-provider в адресной строке веб-браузера, вы увидите следующий вывод.

Вывод поставщика данных SQL

Поставщик данных массива

Класс yii \ data \ ArrayDataProvider лучше всего подходит для работы с большими массивами. Элементами в этом массиве могут быть результаты запроса экземпляров DAO или Active Record.

Шаг 1. Измените метод actionDataProvider следующим образом.

public function actionDataProvider() {
   $data = MyUser::find()->asArray()->all();
   $provider = new ArrayDataProvider([
      'allModels' => $data,
      'pagination' => [
         'pageSize' => 3,
      ],
      'sort' => [
         'attributes' => ['id', 'name'],
      ],
   ]);
   // get the rows in the currently requested page
   $users = $provider->getModels();
   var_dump($users);
}

Шаг 2 — Если вы перейдете по адресу http: // localhost: 8080 / index.php? R = site / data-provider через веб-браузер, вы увидите следующий вывод.

Выходные данные провайдера массива

Обратите внимание, что в отличие от SQL Data Provider и Active Data Provider, Array Data Provider загружает все данные в память, поэтому он менее эффективен.