Yii - ผู้ให้บริการข้อมูล

Yii จัดเตรียมชุดของคลาสผู้ให้บริการข้อมูลที่ห่อหุ้มการแบ่งหน้าและการเรียงลำดับ ผู้ให้บริการข้อมูลใช้ yii \ data \ DataProviderInterface รองรับการดึงข้อมูลที่เรียงลำดับและแบ่งหน้า โดยปกติผู้ให้บริการข้อมูลจะทำงานกับวิดเจ็ตข้อมูล

Yii ประกอบด้วย -

  • ActiveDataProvider - การใช้งาน yii\db\ActiveQuery หรือ yii\db\Query เพื่อสืบค้นข้อมูลจากฐานข้อมูล

  • SqlDataProvider - เรียกใช้ SQL และส่งคืนข้อมูลเป็นอาร์เรย์

  • ArrayDataProvider - รับอาร์เรย์ขนาดใหญ่และส่งคืนส่วนหนึ่ง

คุณกำหนดพฤติกรรมการเรียงลำดับและการแบ่งหน้าของผู้ให้บริการข้อมูลโดยกำหนดค่า pagination และ sortคุณสมบัติ. วิดเจ็ตข้อมูลเช่นyii\grid\GridView, มีทรัพย์สินเรียก dataProviderซึ่งใช้อินสแตนซ์ผู้ให้บริการข้อมูลและแสดงข้อมูลบนหน้าจอ

การเตรียม DB

Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้

  • ในระยะขั้วMySQL -u -p

  • สร้างฐานข้อมูลใหม่ผ่าน CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน

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

Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท

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

การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย

Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล

Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”

โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล

ผู้ให้บริการข้อมูลที่ใช้งานอยู่

Step 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 คลาสใช้คอมโพเนนต์แอ็พพลิเคชัน DB เป็นการเชื่อมต่อ DB

Step 2 - หากคุณป้อนที่อยู่โฮสต์ในพื้นที่ http://localhost:8080/index.php?r=site/dataproviderคุณจะเห็นผลลัพธ์ต่อไปนี้

ผู้ให้บริการข้อมูล SQL

yii\data\SqlDataProvider คลาสทำงานกับคำสั่ง SQL ดิบ

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

Step 2 - ประเภท http://localhost:8080/index.php?r=site/data-provider ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นผลลัพธ์ต่อไปนี้

Array Data Provider

yii\data\ArrayDataProviderคลาสดีที่สุดสำหรับการทำงานกับอาร์เรย์ขนาดใหญ่ องค์ประกอบในอาร์เรย์นี้อาจเป็นผลลัพธ์การสืบค้นของอินสแตนซ์ DAO หรือ Active Record ก็ได้

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

Step 2 - หากคุณไปที่อยู่ http://localhost:8080/index.php?r=site/data-provider ผ่านเว็บเบราว์เซอร์คุณจะเห็นผลลัพธ์ต่อไปนี้

สังเกตว่าไม่เหมือนกับผู้ให้บริการข้อมูล SQL และผู้ให้บริการข้อมูลที่ใช้งานอยู่ Array Data Provider จะโหลดข้อมูลทั้งหมดลงในหน่วยความจำดังนั้นจึงมีประสิทธิภาพน้อยกว่า