Yii - 資料提供器



Yii 提供了一組資料提供器類,封裝了分頁和排序功能。資料提供器實現 yii\data\DataProviderInterface 介面。它支援檢索排序和分頁的資料。資料提供器通常與資料小部件一起使用。

Yii 包括 -

  • ActiveDataProvider - 使用 yii\db\ActiveQueryyii\db\Query 從資料庫查詢資料。

  • SqlDataProvider - 執行 SQL 並將資料作為陣列返回。

  • ArrayDataProvider - 獲取一個大陣列並返回其中的一部分。

透過配置其 paginationsort 屬性,可以定義資料提供器的排序和分頁行為。資料小部件(如 yii\grid\GridView)有一個名為 dataProvider 的屬性,該屬性接收資料提供器例項並在螢幕上顯示資料。

準備資料庫

步驟 1 - 建立一個新的資料庫。可以透過以下兩種方式準備資料庫。

  • 在終端執行 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。此命令將建立一個用於管理我們資料庫的資料庫遷移。遷移檔案應出現在專案根目錄的 migrations 資料夾中。

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

上述遷移建立了一個名為 user 的表,包含以下欄位:id、name 和 email。它還添加了一些演示使用者。

步驟 5 - 在專案根目錄內執行 ./yii migrate 將遷移應用到資料庫。

步驟 6 - 現在,我們需要為 user 表建立一個模型。為簡單起見,我們將使用 Gii 程式碼生成工具。開啟此 url: https://:8080/index.php?r=gii。然後,單擊“Model generator”標題下的“Start”按鈕。填寫表名(“user”)和模型類(“MyUser”),單擊“Preview”按鈕,最後單擊“Generate”按鈕。

Generate Button

MyUser 模型應該出現在 models 目錄中。

活動資料提供器

步驟 1 - 在 SiteController 中建立一個名為 actionDataProvider 的函式。

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 類使用 DB 應用元件作為資料庫連線。

步驟 2 - 如果輸入本地主機地址 https://:8080/index.php?r=site/dataprovider,您將看到以下輸出。

Active Data Provider

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 - 在網頁瀏覽器的位址列中輸入 https://:8080/index.php?r=site/data-provider,您將看到以下輸出。

SQL Data Provider Output

陣列資料提供器

yii\data\ArrayDataProvider 類最適合處理大型陣列。此陣列中的元素可以是 DAO 或活動記錄例項的查詢結果。

步驟 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 - 如果透過網頁瀏覽器訪問地址 https://:8080/index.php?r=site/data-provider,您將看到以下輸出。

Array Data Provider Output

請注意,與 SQL 資料提供器和活動資料提供器不同,陣列資料提供器將所有資料載入到記憶體中,因此效率較低。

廣告