วันอาทิตย์ที่ 26 มกราคม พ.ศ. 2557

สอนใช้งาน Model ใน Yii Framework



     บทความนี้จะสอน วิธีใช้งาน Model ของ Yii Framework กันบ้างครับ บทความก่อนหน้าได้สอนใช้งาน Controller กับ View ไปแล้ว ส่วนนี้จะเป็นส่วนที่สำคัญอีกส่วนหนึ่งซึ่งจะเกี่ยวข้องกับข้อมูลที่แสดงในเว็บไซต์ทั้งหมด เพื่อทำงานกับฐานข้อมูล รวมถึงการ Validation ข้อมูลเพื่อให้ข้อมูลมีความปลอดภัยมากยิ่งขึ้น เช่น ต้องกรอกเป็นตัวเลขเท่านั้น หรือ การกรอกอีเมลหรือเบอร์โทรที่ต้องกรอกให้ถูกต้องตาม Patterm ของมันเท่านั้น

     ขั้นตอนสร้าง Model
1.ให้สร้างเทเบิลในฐานข้อมูลให้เรียบร้อยก่อนครับ จากตัวอย่าง ผมสร้างเทเบิลชื่อ category
มีฟิลด์ 2 ฟิลด์ ชื่อ category_id  ชนิดข้อมูลเป็น INT และเป็นไพรมารี่คีย์ และ category_name ชนิดข้อมูลเป็น VARCHAR

2.จากนั้นเราจะใช้  Yii Code Generator สร้าง โดยพิมพ์ URL ต่อท้าย ว่า index.php?r=gii แล้วใส่รหัสผ่านเพื่อเข้าสู่ส่วนจัดการของ Yii Code Generator
จากนั้นให้คลิกที่เมนูชื่อ Model Generator จะปรากฏฟอร์มให้กรอกข้อมูลตามรูปภาพด้านล่าง


     ให้กรอกชื่อเทเบิลของเราในช่อง Table Name เช่น category มันจะสร้างชื่อ Model Class ให้เราอัตโนมัติ เราสามารถเปลี่ยนชื่อ Model Class ได้ครับ ส่วนตรง Build Relations หมายถึงต้องการให้สร้าง Method relations ใน Model Class ของหรือป่าว ให้ติ๊กไว้ในกรณีที่คิดว่า Table นี้สัมพันธ์(Join)กับ Table อื่นหรือไม่ แต่ถ้า Table ที่เราสร้างนี้ถูกสร้างมาโดดๆไม่สัมพันธ์กับ Table ใดๆ ก็ไม่ต้องติ๊กในส่วนนี้ก็ได้ครับ ให้กด Preview และกด Generate อีกครั้ง

จากตัวอย่าง มันจะสร้างไฟล์ให้เราชื่อ Category.php ในโฟลเดอร์ models ดังรูป


เมื่อเปิดไฟล์ Category.php ขึ้นมา จะมีโค๊ดบางส่วนที่ถูกสร้างเตรียมเอาไว้ให้เรียบร้อยแล้ว ดังนี้

1.ชื่อ Class ในที่นี้ชื่อว่า Category เพราะผมตั้งชื่อ Model Class ในขั้นตอนการสร้าง Model Generator  ว่า Category นั้นเองครับ และได้ extends จาก Class ชื่อ CActiveRecord อีกทีครับ ดังนั้นมันจะมี Method อื่นๆที่อยู่ใน Class ActiveRecord อีกบานเบอะเลยครับ เช่น  findByPk(),find(),findAll(),save(),delete(),deleteAll เป็นต้น ซึ่งจะเป็น method ที่ทำงานเกี่ยวข้องกับฐานข้อมูล สามารถศึกษาเพิ่มเติมจาก http://www.yiiframework.com/doc/api/1.1/CActiveRecord

2.เมธอด model() เอาไว้สำหรับระบุว่าจะเรียกใช้ model ใน controller ในกรณีที่ต้องการจะทำงานร่วมกับฐานข้อมูล เช่น

$modelCategory = new Category;
$modelCategory->model()->findByPk(1); //ดึงข้อมูลจากเทเบิล category ที่ค่าไพรมารี่คีย์เท่ากับ 1


3.เมธอด tableName() จะรีเทิร์นค่าเป็นชื่อของเทเบิล เราสามารถแก้ไขชื่อเทเบิลจากตรงนี้ได้ โดยที่ชื่อModel Class ไม่จำเป็นต้องมีชื่อตรงกับชื่อเทเบิลเสมอไปครับ

4.เมธอด rules() เกี่ยวข้องกับการตรวจสอบความถูกต้องของข้อมูลจากฟอร์มที่เรากรอก ก่อนที่ข้อมูลจะถูกบันทึกลงฐานข้อมูลครับ มันจะรีเทิร์นค่าเป็นอาร์เรย์ ตัวอย่างเช่น array('category_name', 'length', 'max'=>50) หมายถึงกรอกข้อมูลในช่องข้อมูลชื่อ category_name ไม่เกิน 50 ตัวอักษร จะเป็นค่าว่างก็ได้ ผมสามารถเปลี่ยนคำสั่งนี้ได้เช่น
array('category_name', 'length', 'min'=>6, 'max'=>50) หมายถึงขนาดตัวอักษร 6-50 ตัวอักษรเท่านั้น
สำหรับรายละเอียดอื่นๆเกี่ยวกับ rule สามารถศึกษาเพิ่มเติมได้จากที่นี่ http://www.yiiframework.com/wiki/56/

5.เมธอด  relations() เกี่ยวข้องกับการ Join เทเบิล หรือ ความสัมพันธ์ระหว่างเทเบิล(Relations) ตั้งแต่ 2 เทเบิลขึ้นไป นั้นเอง มันจะมีอ๊อบชั่นให้เราเลือก 3 แบบ คือ BELONGS_TO, HAS_MANY, HAS_ONE, MANY_MANY
สามารถศึกษาจาก http://www.yiiframework.com/doc/guide/1.1/en/database.arr

6.เมธอด attributeLabels() จะเกี่ยวข้องกับการตั้งชื่อ สำหรับแสดงผลในฟอร์มหรือแสดงผลชื่อในข้อผิดพลาดจากการกรอกข้อมูล เราสามารถแก้ไขชื่อได้ เช่น

   public function attributeLabels()
    {
        return array(
            'category_id' => 'Category',
            'category_name' => 'Category Name'
        );
    }

แก้ไขเป็น

   public function attributeLabels()
    {
        return array(
            'category_id' => 'รหัสหมวดสินค้า',
            'category_name' => 'ชื่อหมวดสินค้า'
        );
   }

7.เมธอด search() จะถูกเรียกใช้ในตอนค้นหาข้อมูล ซึ่งมันจะทำงานสัมพันธุ์กับ เมธอด rules เพราะเมธอด rules จะเป็นตัวกำหนดว่า ให้สามารถค้นหาได้จากฟิลด์อะไรบ้าง เช่น

    public function rules()
    {
        return array(
            array('category_id, category_name', 'safe', 'on'=>'search')
        );
    }

สามารถค้นหาจากฟิลด์ category_id และ category_name ได้

1 ความคิดเห็น :

  1. สงสัยตรงไหนสามารถสอบถามได้ครับ ผมก็เองก็ยังมือใหม่อยู่ครับ

    ตอบลบ