Yii - Fournisseurs de données

Yii fournit un ensemble de classes de fournisseurs de données qui encapsulent la pagination et le tri. Un fournisseur de données implémente yii \ data \ DataProviderInterface. Il prend en charge la récupération de données triées et paginées. Les fournisseurs de données travaillent généralement avec des widgets de données.

Yii comprend -

  • ActiveDataProvider - Utilisations yii\db\ActiveQuery ou yii\db\Query pour interroger les données des bases de données.

  • SqlDataProvider - Exécute SQL et renvoie les données sous forme de tableaux.

  • ArrayDataProvider - Prend un grand tableau et en renvoie une partie.

Vous définissez les comportements de tri et de pagination d'un fournisseur de données en configurant son pagination et sortPropriétés. Widgets de données, tels queyii\grid\GridView, avoir une propriété appelée dataProvider, qui prend une instance de fournisseur de données et affiche les données à l'écran.

Préparation de la base de données

Step 1- Créez une nouvelle base de données. La base de données peut être préparée des deux manières suivantes.

  • Dans le terminal, exécutez mysql -u root –p .

  • Créer une nouvelle base de données via CREATE DATABASE helloworld JEU DE CARACTÈRES utf8 COLLATE utf8_general_ci;

Step 2 - Configurer la connexion à la base de données dans le config/db.phpfichier. La configuration suivante correspond au système actuellement utilisé.

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

Step 3 - Dans le dossier racine run ./yii migrate/create test_table. Cette commande créera une migration de base de données pour gérer notre base de données. Le fichier de migration doit apparaître dans lemigrations dossier de la racine du projet.

Step 4 - Modifier le fichier de migration (m160106_163154_test_table.php dans ce cas) de cette façon.

<?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');
      }
   }
?>

La migration ci-dessus crée un usertable avec ces champs: id, nom et e-mail. Il ajoute également quelques utilisateurs de démonstration.

Step 5 - À l'intérieur de la racine du projet run ./yii migrate pour appliquer la migration à la base de données.

Step 6 - Maintenant, nous devons créer un modèle pour notre usertable. Par souci de simplicité, nous allons utiliser leGiioutil de génération de code. Ouvrez ceciurl: http://localhost:8080/index.php?r=gii. Ensuite, cliquez sur le bouton «Démarrer» sous l'en-tête «Générateur de modèle». Remplissez le nom de la table («utilisateur») et la classe de modèle («Mon utilisateur»), cliquez sur le bouton «Aperçu» et enfin, cliquez sur le bouton «Générer».

Le modèle MyUser doit apparaître dans le répertoire des modèles.

Fournisseur de données actif

Step 1 - Créez une fonction appelée actionDataProvider à l'intérieur de 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);
}

Dans le code ci-dessus, nous définissons une instance du ActiveDataProviderclasse et affichez les utilisateurs de la première page. leyii\data\ActiveDataProvider La classe utilise le composant d'application DB comme connexion DB.

Step 2 - Si vous entrez l'adresse de l'hôte local http://localhost:8080/index.php?r=site/dataprovider, vous verrez la sortie suivante.

Fournisseur de données SQL

le yii\data\SqlDataProvider La classe fonctionne avec des instructions SQL brutes.

Step 1 - Modifier le actionDataProvider méthode de cette façon.

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);
}

Step 2 - Type http://localhost:8080/index.php?r=site/data-provider dans la barre d'adresse du navigateur Web, vous verrez la sortie suivante.

Fournisseur de données de baie

le yii\data\ArrayDataProviderclass est le meilleur pour travailler avec de grands tableaux. Les éléments de ce tableau peuvent être des résultats de requête d'instances DAO ou Active Record.

Step 1 - Modifier le actionDataProvider méthode de cette façon.

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);
}

Step 2 - Si vous allez à l'adresse http://localhost:8080/index.php?r=site/data-provider via le navigateur Web, vous verrez la sortie suivante.

Notez que, contrairement au fournisseur de données SQL et au fournisseur de données actives, le fournisseur de données de tableau charge toutes les données dans la mémoire, ce qui le rend moins efficace.