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", "[email protected]"], ["User2", "[email protected]"], ["User3", "[email protected]"], ["User4", "[email protected]"], ["User5", "[email protected]"], ["User6", "[email protected]"], ["User7", "[email protected]"], ["User8", "[email protected]"], ["User9", "[email protected]"], ["User10", "[email protected]"], ["User11", "[email protected]"], ]); } 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 в адресной строке веб-браузера, вы увидите следующий вывод.
Поставщик данных массива
Класс 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 загружает все данные в память, поэтому он менее эффективен.