Yii - Fornitori di dati

Yii fornisce una serie di classi di provider di dati che incapsulano l'impaginazione e l'ordinamento. Un fornitore di dati implementa yii \ data \ DataProviderInterface. Supporta il recupero di dati ordinati e impaginati. I fornitori di dati di solito lavorano con i widget di dati.

Yii include -

  • ActiveDataProvider - Utilizza yii\db\ActiveQuery o yii\db\Query per eseguire query sui dati dai database.

  • SqlDataProvider - Esegue SQL e restituisce i dati come array.

  • ArrayDataProvider - Prende una grande matrice e ne restituisce una parte.

Definisci i comportamenti di ordinamento e impaginazione di un fornitore di dati configurandone i file pagination e sortproprietà. Widget di dati, comeyii\grid\GridView, hanno una proprietà chiamata dataProvider, che accetta un'istanza del fornitore di dati e visualizza i dati sullo schermo.

Preparazione del DB

Step 1- Crea un nuovo database. Il database può essere preparato nei due modi seguenti.

  • Nel terminale eseguire mysql -u root –p .

  • Crea un nuovo database tramite CREATE DATABASE helloworld SET DI CARATTERI utf8 COLLATE utf8_general_ci;

Step 2 - Configurare la connessione al database in config/db.phpfile. La seguente configurazione è per il sistema attualmente utilizzato.

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

Step 3 - All'interno della cartella principale run ./yii migrate/create test_table. Questo comando creerà una migrazione del database per la gestione del nostro DB. Il file di migrazione dovrebbe apparire nel filemigrations cartella della radice del progetto.

Step 4 - Modifica il file di migrazione (m160106_163154_test_table.php in questo caso) in questo modo.

<?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 migrazione di cui sopra crea un file usertabella con questi campi: id, nome ed email. Aggiunge anche alcuni utenti demo.

Step 5 - All'interno della radice del progetto run ./yii migrate per applicare la migrazione al database.

Step 6 - Ora, dobbiamo creare un modello per il nostro usertavolo. Per motivi di semplicità, utilizzeremo ilGiistrumento di generazione del codice. Apri questourl: http://localhost:8080/index.php?r=gii. Quindi, fare clic sul pulsante "Start" sotto l'intestazione "Generatore di modelli". Compilare il nome della tabella ("utente") e la classe del modello ("MyUser"), fare clic sul pulsante "Anteprima" e infine fare clic sul pulsante "Genera".

Il modello MyUser dovrebbe apparire nella directory dei modelli.

Fornitore attivo di dati

Step 1 - Crea una funzione chiamata actionDataProvider dentro il 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);
}

Nel codice sopra, definiamo un'istanza di ActiveDataProviderclass e visualizzare gli utenti dalla prima pagina. Ilyii\data\ActiveDataProvider class utilizza il componente dell'applicazione DB come connessione DB.

Step 2 - Se inserisci l'indirizzo dell'host locale http://localhost:8080/index.php?r=site/dataprovider, vedrai il seguente output.

Provider di dati SQL

Il yii\data\SqlDataProvider class funziona con istruzioni SQL non elaborate.

Step 1 - Modifica il file actionDataProvider metodo in questo modo.

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 - Tipo http://localhost:8080/index.php?r=site/data-provider nella barra degli indirizzi del browser web, vedrai il seguente output.

Provider di dati array

Il yii\data\ArrayDataProviderclass è la migliore per lavorare con grandi array. Gli elementi in questa matrice possono essere risultati di query di istanze DAO o Active Record.

Step 1 - Modifica il file actionDataProvider metodo in questo modo.

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 - Se vai all'indirizzo http://localhost:8080/index.php?r=site/data-provider attraverso il browser web, vedrai il seguente output.

Si noti che, a differenza di SQL Data Provider e Active Data Provider, Array Data Provider carica tutti i dati nella memoria, quindi è meno efficiente.