version 4.1.0

บทที่ 9 การดึงข้อมูลออกจากฐานข้อมูล

  อังคารที่ 27 มกราคม พ.ศ. 2558 เวลา 08:58:17 น.      19,782 ครั้ง


บทที่ 9 การดึงข้อมูลออกจากฐานข้อมูล

แนะนำ

วิธีการดึงข้อมูลจาก "ตาราง" ในฐานข้อมูลมาแสดงเป็นตาราง "GridView" ได้นั้นเราต้องทำการแปลง Data ของเรา ให้อยู่ในรูปของข้อมูลแบบ dataProvider ซะก่อน ซึ่งคำสั่งหลักมี 2 คำสั่ง คือ CSqlDataProvider และ CActiveDataProvider ด้วยกัน

บทนี้มีอะไรบ้าง

  1. ตอนที่ 1 Data Access Object (DAO)
  2. ตอนที่ 2 Active Record (Model)
  3. ตอนที่ 3 การดึงข้อมูลแบบไม่ต้องใช้ Data Access Object หรือ CActiveDataProvider

DAO Class ใน Yii Framework

  • CDbConnection สำหรับจัดการ Database Connection
  • CDbCommand สำหรับประมวลผลของชุดคำสั่ง SQL
  • CDbDataReader สำหรับดึงข้อมูลจาก Result Set
  • CDbTransaction สำหรับจัดการ Transaction

DAO Class เวลาต้องการใช้งาน ในไฟล์ php.ini จะต้องเปิดใช้งาน Modules php_mysql, php_pdo, php_pdo_mysql ไว้ด้วย

ตัวอย่างคำสั่ง

 
/** Comment **/
/** เชื่อมต่อฐานข้อมูลในไฟล์ config/main.php **/
$connection = Yii::app()->db;

/** หรือ ระบุการเชื่อมต่อโดยตรง **/
$connection = new CDbConnection (
    'mysql:host=localhost;dbname=db_yii_tutorial','root','1234'
);

/** เปิด Connection **/
$connection->active = true;

/** ดึงข้อมูล **/
$sql = 'SELECT * FROM tbl_profile';
$command = $connection->createCommand($sql);
$dataReader = $command->query();
foreach ($dataReader as $row) { 
    echo $row['firstname'] . ' - ' . $row['lastname'];
}

/** ปิด Connection **/
$connection->active = false;

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 1 | รูปภาพตัวอย่าง

สร้าง Controller ใหม่ โดยกำหนด Controller ID เป็น "Member" ส่วน Action IDs ใส่เป็น "index" จากนั้นกด Preview

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 2 | รูปภาพตัวอย่าง

แสดงผลหลังกดปุ่ม Preview

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 3 | รูปภาพตัวอย่าง

จากนั้นแล้วกด Generate ต่อครับ ระบบจะสร้าง Member Controller ให้เราเรียบร้อย และแสดงผลหลังกด Generate

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 4 | รูปภาพตัวอย่าง

ลองเข้าไป test เรียกดูที่ path ของแต่ละคน จะได้หน้าตาแบบนี้

เข้าไปที่ URL : http://localhost/yii_tutorial/index.php?r=member

ให้เข้าไปแก้ไขไฟล์ "MemberController.php" ไดเรคทอรี่ [skeleton]/protected/controllers/MemberController.php

สร้าง Method actionShow() ใหม่ดังนี้

 
// ก่อน
class MemberController extends Controller {
    public function actionIndex() {
        $this->render('index');
    }
    public function actionShow() {
        $sql = "SELECT * FROM tbl_profile ORDER BY user_id ASC"; // คำสั่ง SQL ที่ต้องการ
        $dataProvider = new CSqlDataProvider($sql, array( // เอา sql แปลงเป็น dataProvider
            'pagination' => array(
                'pageSize' => 10,  // กำหนดให้หน้านึงแสดง 10 รายการ
            ),
            'keyField' => 'user_id',
        ));
        $this->render('show', array(
            'dataProvider' => $dataProvider, // ส่งตัวแปรไปยัง view
        ));   
    }
};

ต่อไปเขียนคำสั่งสร้าง CGridView โดยทำการสร้างไฟล์ View ชื่อว่า show.php ในไดเรคทอรี่ [skeleton]/protected/views/member/show.php

ตัวอย่างคำสั่ง

 
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'profile-gridview',           // ชื่อ CGridView
    'dataProvider' => $dataProvider,    // ตัวแปร data ที่มีข้อมูล
    'enablePagination' => true,         // กำหนดให้แสดงปุ่มเปลี่ยนหน้า
    'columns' => array(                 // กำหนด column ที่จะแสดง
        array(
            'header' => 'User ID',  // ชื่อ Header (ตั้งเอง)
            'name' => 'user_id',  // ชื่อ Field
        ),
        array(
            'header' => 'Firstname',  // ชื่อ Header (ตั้งเอง)
            'name' => 'firstname',  // ชื่อ Field
        ),
        array(
            'header' => 'Lastname',  // ชื่อ Header (ตั้งเอง)
            'name' => 'lastname',  // ชื่อ Field
        ),
    ),
));

เพียงเท่านี้ครับ จากนั้นไปลอง preview ในหน้าเว็บเรา http://localhost/yii_tutorial/index.php?r=member/show

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 5 | รูปภาพตัวอย่าง

แสดงผลของ CSqlActiveReport ด้วย GridView สำเร็จแล้ว



หากเราสร้าง Model มาแล้วในบทที่ 7 การใช้งาน Gii Code Generator ก็สามารถเรียกใช้งานได้เลย ไม่ต้องสร้างใหม่ แต่หากยังไม่ได้สร้างไฟล์ Model ขึ้นมาแนะนำให้เข้าไปศึกษาวิธีการสร้างไฟล์ Model ได้จาก บทที่ 7 การใช้งาน Gii Code Generator ก่อน

แก้ไขไฟล์ MemberController.php ไดเรคทอรี่ [skeleton]/protected/controllers/MemberController.php

สร้าง Method ชื่อว่า actionModel() ตามตัวอย่างด้านล่างนี้

 // in MemberController.php
public function actionModel() {
    // Profile คือชื่อ Model ที่สร้างไว้ใน Gii
    $dataProvider = new CActiveDataProvider('Profile', array(  
        'pagination' => array(
            'pageSize' => 10,   // จำนวนรายการที่แสดงต่อหน้า
        ),
    ));
    $this->render('model', array(
        'dataProvider' => $dataProvider,
    ));
 }

ต่อไปเขียนคำสั่งสร้าง CGridView โดยทำการสร้างไฟล์ View ชื่อว่า model.php ในไดเรคทอรี่ [skeleton]/protected/views/member/model.php

ตัวอย่างคำสั่ง

 
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'profile-gridview',           // ชื่อ CGridView
    'dataProvider' => $dataProvider,    // ตัวแปร data ที่มีข้อมูล
    'enablePagination' => true,         // กำหนดให้แสดงปุ่มเปลี่ยนหน้า
    'columns' => array(                 // กำหนด column ที่จะแสดง
        array(
            'header' => 'User ID',  // ชื่อ Header (ตั้งเอง)
            'name' => 'user_id',  // ชื่อ Field
        ),
        array(
            'header' => 'Firstname',  // ชื่อ Header (ตั้งเอง)
            'name' => 'firstname',  // ชื่อ Field
        ),
        array(
            'header' => 'Lastname',  // ชื่อ Header (ตั้งเอง)
            'name' => 'lastname',  // ชื่อ Field
        ),
    ),
));

เพียงเท่านี้ครับ จากนั้นไปลอง preview ในหน้าเว็บเรา http://localhost/yii_tutorial/index.php?r=member/model

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 6 | รูปภาพตัวอย่าง

แสดงผลของ CActiveDataProvider ด้วย GridView สำเร็จแล้ว



ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findAll();
foreach ($model as $rows){
    // ตรง attribute_name ให้ใส่ชื่อ Attribute ของ Model จะสามารถเก็บค่าเข้าหรือดึงค่าออกได้ตามสะดวก
    echo $rows->attribute_name;  // แสดงข้อมูล field attribute_name
}

// ตัวอย่าง
$model = Profile::model()->findAll(); // return data (array)
foreach ($model as $rows){
    echo $rows->firstname;  // แสดงข้อมูล field firstname
}

1. การดึงข้อมูลออกจาก Database ออกมาทั้งหมด โดยไม่กำหนดเงื่อนไข

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findAllByPk($pk);
foreach ($model as $rows){
    // ตรง attribute_name ให้ใส่ชื่อ Attribute ของ Model จะสามารถเก็บค่าเข้าหรือดึงค่าออกได้ตามสะดวก
    echo $rows->attribute_name;  // แสดงข้อมูล field attribute_name
}

// ตัวอย่าง
$model = Profile::model()->findAllByPk(1); // Field user_id (PK) = 1
foreach ($model as $rows){
    echo $rows->firstname;  // แสดงข้อมูล field firstname
}

2. การดึงข้อมูลออกจาก Database ออกมาทั้งหมด โดยกำหนดเงื่อนไข คือ PK = $pk (ค่าที่ต้องการ)

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findAllByAttributes(array('attributes_name' => $value))
foreach ($model as $rows){
    // ตรง attribute_name ให้ใส่ชื่อ Attribute ของ Model จะสามารถเก็บค่าเข้าหรือดึงค่าออกได้ตามสะดวก
    echo $rows->attribute_name;  // แสดงข้อมูล field attribute_name
}

// ตัวอย่าง
// Field firstname = 'Administrator'
$model = Profile::model()->findAllByAttributes(array('firstname' => 'Administrator')); 
foreach ($model as $rows){
    echo $rows->firstname;  // แสดงข้อมูล field firstname
}

// หรือ ตัวอย่าง
// Field firstname = 'Administrator'
$model = Profile::model()->findAllByAttributes(array(
    'firstname' => 'Administrator',  // Field firstname = 'Administrator'
    'lastname' => 'Admin', // Field lastname = 'Admin'
)); 
foreach ($model as $rows){
    echo $rows->firstname;  // แสดงข้อมูล field firstname
}

3. การดึงข้อมูลออกจาก Database ออกมาทั้งหมด โดยกำหนดเงื่อนไข (array) คือ attributes_name = $value (ค่าที่ต้องการ)

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->find();
echo $model->attributes_name; // แสดงข้อมูล field attributes_name

// ตัวอย่าง
$model = Profile::model()->find(); // return data (array object)
echo $model->firstname;  // Administrator

4. การดึงข้อมูลออกจาก Database ออกมา 1 รายการ (รายการสุดท้าย) เท่านั้น โดยไม่กำหนดเงื่อนไข

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findByPk($pk);
echo $model->attributes_name; // แสดงข้อมูล field attributes_name

// ตัวอย่าง
$model = Profile::model()->findByPk(1); // Field user_id (PK) = 1
echo $model->firstname;  // Administrator

5. การดึงข้อมูลออกจาก Database ออกมา 1 รายการ (รายการสุดท้าย) เท่านั้น โดยกำหนดเงื่อนไข คือ PK = $pk (ค่าที่ต้องการ)

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findByAttributes(array('attributes_name' => $value));
echo $model->attributes_name; // แสดงข้อมูล field attributes_name

// ตัวอย่าง
$model = Profile::model()->findByAttributes(array(
    'firstname' => 'Administrator',  // Field firstname = 'Administrator'
));
echo $model->firstname;  // Administrator

6. การดึงข้อมูลออกจาก Database ออกมา 1 รายการ (รายการสุดท้าย) เท่านั้น โดยกำหนดเงื่อนไข (array) คือ attributes_name1 = $value1, attributes_name2 = $value2 (ค่าที่ต้องการ)

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findAllBySql($sql);;
foreach ($model as $rows){
    // ตรง attribute_name ให้ใส่ชื่อ Attribute ของ Model จะสามารถเก็บค่าเข้าหรือดึงค่าออกได้ตามสะดวก
    echo $rows->attribute_name;  // แสดงข้อมูล field attribute_name
}

// ตัวอย่าง
// return data (array)
$model = Profile::model()->findAllBySql("SELECT * FROM tbl_profile ORDER BY user_id DESC"); 
foreach ($model as $rows){
    echo $rows->firstname;  // แสดงข้อมูล field firstname
}

7. การใช้คำสั่ง SQL ดึงข้อมูลออกจาก Database ออกมาทั้งหมด

ตัวอย่างคำสั่ง

 
// ModelName ชื่อ Model ที่เราต้องการดึงข้อมูล                        
$model = ModelName::model()->findBySql($sql);;
foreach ($model as $rows){
    // ตรง attribute_name ให้ใส่ชื่อ Attribute ของ Model จะสามารถเก็บค่าเข้าหรือดึงค่าออกได้ตามสะดวก
    echo $rows->attribute_name;  // แสดงข้อมูล field attribute_name
}

// ตัวอย่าง
// return data (array)
$sql = "SELECT * FROM tbl_profile WHERE user_id = 1 ORDER BY user_id DESC";
$model = Profile::model()->findBySql($sql); 
foreach ($model as $rows){
    echo $rows->firstname;  // แสดงข้อมูล field firstname
}

8. การใช้คำสั่ง SQL ดึงข้อมูลออกจาก Database ออกมา 1 รายการ (รายการสุดท้าย) เท่านั้น

อธิบายวิธีการ Find แบบต่าง ๆ

  • จะ find แบบไหนก็ว่าไป findByPk, findAll, findByAttributes,...
  • ถ้า find แล้วไม่เจอมันจะคืน Null แต่ถ้าเจอมันจะคืนเป็น Model Object
  • ถ้าตอน find ใช้เป็นตระกูล findAll ค่ามันจะออกมาทุกตัว (มาทั้งตาราง) เวลาจะใช้ก็ให้ "วนลูป" นำข้อมูลออกมาใช้ทีละตัว

ตัวอย่างคำสั่ง "วนลูป" นำข้อมูลออกมาใช้ทีละตัว

 
foreach ($model as $value){
    // ตรง attribute_name ให้ใส่ชื่อ Attribute ของ Model จะสามารถเก็บค่าเข้าหรือดึงค่าออกได้ตามสะดวก
    echo $value->attribute_name; 
}



Credit

  ขอบคุณข้อมูลจากเว็บไซต์ yii.in.th


นักแปล / นักเขียน / เรียบเรียง

author

เอกบิณ ใจแก้วมา (แม็ก)

"โปรแกรมเมอร์ตัวเล็ก ๆ" สะสมประสบการณ์ด้านการพัฒนาซอฟแวร์มามากกว่า 11 ปี
# ติดตามผลงานได้ที่ | พบกับเราที่ Google+ | Facebook






Comment