/ / Codeigniter / Comments (16)

Xây dựng main Model CodeIgniter

Ở bài trước mình đã giới thiệu cho các bạn về cách xây dựng main controller trong CodeIgniter,các bạn cũng thấy lợi ích to lớn từ nó mang lại rồi phải không nào.Trong bài này mình sẽ hướng dẫn các bạn xây dựng main Model cho ứng dụng của mình.Theo mình quan niệm thì tất cả các hành động thêm,sửa,xóa,lấy dữ liệu…từ các bảng là hoàn toàn giống nhau chỉ khác ở tên bảng các các cột trong bảng thôi,còn truy trình thì hoàn toàn giống nhau.Vì vậy lên mình đã xây dựng ra 1 main Model để xử lý chung tất cả các hành động trên.Như các bạn biết thì tất cả các model trong CodeIgniter đề phải kế thừa từ lớp CI_Model phải không nào.Nếu chúng ta xây dựng main model thì tất cả các model trong dự án sẽ được kế thưa từ main Model này.

– Để nghiên cứu sang bài này thì các bạn lên tìm hiểu trước các bài sau:

  1. Tổng quan về CodeIgniter framework
  2. Model trong CodeIgniter

Cũng như xây dựng main controller,chúng ta sẽ xây dựng main Model bên trong thư mục application/core.Các bạn hãy tạo 1 file có tên là MY_model.php với nội dung như sau:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Model extends CI_Model {
	// Ten table
	var $table = '';
}

+ Với đoạn code trên mình đang xây dựng phương thức MY_Model kế thừa từ lớp CI_Model,như vậy tất cả các model của chúng ta hoàn toàn có thể kế thừa từ MY_Model rồi phải không nào.
+ Trong lớp này mình tạo 1 biến $table là tên bảng dữ liệu muốn xử lý,trong model chúng ta cũng cần khai báo biến này để cho biết model này đang làm việc với bảng dữ liệu nào.

– Xây dựng phương thức thêm mới dữ liệu:

    /**
    * Them row moi
    */
    function create($data)
    {
        if($this->db->insert($this->table, $data))//thêm dữ liệu
        {
           return TRUE;
        }else{
           return FALSE;
        }
    }

Phương thức này có chức năng thêm mới 1 dữ liệu vào 1 bảng nào đó,tham số($data) của nó truyền vào đây chính là dữ liệu muốn thêm.Phương thức trả về TRUE nếu thêm thành công và ngược lại

– Xây dựng phương thức cập nhật dữ liệu:

    /**
    * Cap nhat row tu id
    */
    function update($id, $data)
    {
        if (!$id)
        {
            return FALSE;
        }
        $where = array();
        $where['id'] = $id;//điều kiện khóa chính bằng $id truyền vào
            return $this->update_rule($where, $data);
    }

    /**
    * Cap nhat row tu dieu kien
    * $where: điều kiện
    */
    function update_rule($where, $data)
    {
        if (!$where)
        {
            return FALSE;
        }
        $this->db->where($where);//thêm điều kiện
        if($this->db->update($this->table, $data))//cập nhật dữ liệu
        {
            return TRUE;
        }
        return FALSE;
    }

Ở trên mình xây dựng 2 phương thức với các chức năng cụ thể như sau:
+ Phương thức update để cập nhật dữ liệu từ khóa chính (id),tham số($data) của nó truyền vào đây chính là dữ liệu muốn cập nhật.Phương thức trả về TRUE nếu cập nhật thành công và ngược lại
+ Phương thức update_rule có chức năng cập nhật dữ liệu từ 1 điều kiện nào đó.

– Xây dựng phương thức xóa dữ liệu:

     /**
     *Xoa row tu id
     */
     function delete($id)
     {
         if (!$id)
                 {
             return FALSE;
         }
         if(is_numeric($id))//nếu $id là số
         {
             $where = array('id' => $id);
         }else
         {
                         //id nằm trong chuoi các id truyền vào
             $where =  "id IN (".$id.") ";
         }
         return $this->del_rule($where);
     }

     /**
     * Xoa row tu dieu kien
     */
     function del_rule($where)
     {
         if (!$where)
         {
             return FALSE;
         }
         $this->db->where($where);//thêm điều kiện
         if($this->db->delete($this->table))//thực hiện xóa
         {
             return TRUE;
         }
         return FALSE;
     }

Ở trên mình xây dựng 2 phương thức với các chức năng cụ thể như sau:
+ Phương thức delete để xóa dữ liệu từ khóa chính (id).Phương thức trả về TRUE nếu xóa thành công và ngược lại
+ Phương thức del_rule có chức năng xóa dữ liệu từ 1 điều kiện nào đó.

– Xây dựng phương thức lấy thông tin 1 dữ liệu:

    /**
    * Lay thong tin cua row tu id
    * $id: Khóa chính muốn lấy thông tin
    */
    function get_info($id)
    {
        if (!$id)
        {
            return FALSE;
        }
        $where = array();
        $where['id'] = $id;
        return $this->get_info_rule($where);
    }

    /**
     * Lay thong tin cua row tu dieu kien
     * $where: Mảng điều kiện
     */
    function get_info_rule($where = array())
    {
        $this->db->where($where);
        $query = $this->db->get($this->table);
        if ($query->num_rows())
        {
            return $query->row();
        }
        return FALSE;
    }

Ở trên mình xây dựng 2 phương thức với các chức năng cụ thể như sau:
+ Phương thức get_info để lấy thông tin 1 dữ liệu từ khóa chính (id).Nếu thành công thì phương thức trả về thông tin dữ liệu và ngược lại sẽ trả về FALSE
+ Phương thức get_info_rule có chức năng lấy thông tin 1 dữ liệu dữ liệu từ 1 điều kiện nào đó.

– Xây dựng phương thức lấy danh sách dữ liệu:

    /**
    * Lay danh sach
    */
    function get_list($input = array())
    {
                //gắn các tùy chọn nếu có
        $this->get_list_set_input($input);
        //thuc hien truy van du lieu
        $query = $this->db->get($this->table);
                //tra ve du lieu
        return $query->result();
    }

    /**
    * Gan cac thuoc tinh trong input khi lay danh sach
    */
    protected function get_list_set_input($input)
    {
         // Select
	 if (isset($input['select']))
	 {
	      $this->db->select($input['select']);
	 }
        // Thêm điều kiện cho câu truy vấn truyền qua biến $input['where']

        if ((isset($input['where'])) && $input['where'])
        {
            $this->db->where($input['where']);
        }
                // Thêm sắp xếp dữ liệu thông qua biến $input['order'] (ví dụ $input['order'] = array('id','DESC'))
        if (isset($input['order'][0]) && isset($input['order'][1]))
        {
            $this->db->order_by($input['order'][0], $input['order'][1]);
        }
        else
        {
            //mặc định sẽ sắp xếp theo id giảm dần
            $this->db->order_by('id', 'desc');
        }

        // Thêm điều kiện limit cho câu truy vấn thông qua biến $input['limit'] (ví dụ $input['limit'] = array('10' ,'0'))
        if (isset($input['limit'][0]) && isset($input['limit'][1]))
        {
            $this->db->limit($input['limit'][0], $input['limit'][1]);
        }     
    }

Ở trên mình xây dựng 1 phương thức lấy danh sách dữ liệu,trong phương thức này chúng ta truyền vào 1 tham số duy nhất có kiểu dữ liệu là mảng,và nó có thể tùy biến lấy dữ liệu theo điều kiện,sắp xếp dữ liệu,limit dữ liệu thông qua phương thức get_list_set_input:
+ Lấy danh sach theo điều kiện chỉ cần truyền vào biến $input['where']
+ Lấy danh sach theo sắp xếp theo 1 trường dữ liệu nào đó chỉ cần truyền vào biến $input['order']
+ Lấy danh sach theo cần limit dữ chỉ cần truyền vào biến $input['limit'],có thể thực hiện phân trang.

– Xây dựng phương thức lấy tổng số dữ liệu:

    /**
    * Lay tong so
    */
    function get_total($input = array())
    {
                //gắn các tùy chọn nếu có
        $this->get_list_set_input($input);
        //thuc hien truy van du lieu
        $query = $this->db->get($this->table);
        //tra ve du lieu
        return $query->num_rows();
    }

Đây là phương thức thấy tổng số dữ liệu trả vể từ câu lệnh truy vấn.Nó cũng có thăm số và tùy chỉnh như phương thức get_list phía trên thông qua phương thức get_list_set_input

Cách sử dụng:

Xây dựng 1 model product_model.php với nội dung:

<?php
class Product_model extends MY_Model
{
	//ten bang du lieu
	public $table = 'product';
}

Và tạo 1 controller product.php với nội dung:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');  

class Product extends MY_Controller
{
   /*
   * Ham khi khoi tao
   */
   public function __construct()
   {
       parent::__construct();
       $this->load->model('product_model');//tải file model
   }
    /*
    * Trang dang danh sách sản phẩm
    */
   public function index()
   {
          //gan diều kiện cho câu truy vấn
	  $input = array();
	  $input['limit'] = array('5', 0);
          $products = $this->product_model->get_list($input);
          print_r($products);
   }
   /**
    * Them moi
   */
   function add()
   {
         //luu toan bo thong tin san pham vao csdl
          $data = array();
          $data['name']   = 'Nokia 520';
          $data['price']  = '3000000';
          if($this->product_model->create($data))
          {
                //gui thong bao thanh cong
         }
   }
}

Với ví dụ trên với phương thức index() mình đang thực hiện lấy danh sách 5 sản phẩm đầu tiên trong bảng product
Với phương thức add() mình đang thực hiện thêm mới 1 sản phẩm mới
Như các bạn thấy code trong model của chúng ta lúc này thật đơn giản và ngắn gọn phải không nào.Đây là ví dụ cho bảng sản phẩm thôi,sang các bảng khác các bạn cũng làm tương tự chỉ cần thay đổi mỗi biến $table thành bảng dữ liệu tương ứng là được.
Và toàn bộ code trong MY_Model.php sẽ như sau:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Model extends CI_Model {
	// Ten table
	var $table = '';
    /**
    * Them row moi
    */
    function create($data)
    {
        if($this->db->insert($this->table, $data))//thêm dữ liệu
        {
           return TRUE;
        }else{
           return FALSE;
        }
    }

    /**
    * Cap nhat row tu id
    */
    function update($id, $data)
    {
        if (!$id)
        {
            return FALSE;
        }
        $where = array();
        $where['id'] = $id;//điều kiện khóa chính bằng $id truyền vào
            return $this->update_rule($where, $data);
    }

    /**
    * Cap nhat row tu dieu kien
    * $where: điều kiện
    */
    function update_rule($where, $data)
    {
        if (!$where)
        {
            return FALSE;
        }
        $this->db->where($where);//thêm điều kiện
        if($this->db->update($this->table, $data))//cập nhật dữ liệu
        {
            return TRUE;
        }
        return FALSE;
    }

     /**
     *Xoa row tu id
     */
     function delete($id)
     {
         if (!$id)
                 {
             return FALSE;
         }
         if(is_numeric($id))//nếu $id là số
         {
             $where = array('id' => $id);
         }else
         {
                         //id nằm trong chuoi các id truyền vào
             $where =  "id IN (".$id.") ";
         }
         return $this->del_rule($where);
     }

     /**
     * Xoa row tu dieu kien
     */
     function del_rule($where)
     {
         if (!$where)
         {
             return FALSE;
         }
         $this->db->where($where);//thêm điều kiện
         if($this->db->delete($this->table))//thực hiện xóa
         {
             return TRUE;
         }
         return FALSE;
     }
    /**
     * Xoa row tu dieu kien
     */
    function del_all($where)
    {
        if (!$where)
        {
            return FALSE;
        }
        //where_in($cot, $mang_gia_tri)
         $this->db->where_in($this->key,$where);
        $this->db->delete($this->table);

        return TRUE;
    }

    /**
    * Lay thong tin cua row tu id
    * $id: Khóa chính muốn lấy thông tin
    */
    function get_info($id)
    {
        if (!$id)
        {
            return FALSE;
        }
        $where = array();
        $where['id'] = $id;
        return $this->get_info_rule($where);
    }

    /**
     * Lay thong tin cua row tu dieu kien
     * $where: Mảng điều kiện
     */
    function get_info_rule($where = array())
    {
        $this->db->where($where);
        $query = $this->db->get($this->table);
        if ($query->num_rows())
        {
            return $query->row();
        }
        return FALSE;
    }

    /**
    * Lay tong so
    */
    function get_total($input = array())
    {
                //gắn các tùy chọn nếu có
        $this->get_list_set_input($input);
        //thuc hien truy van du lieu
        $query = $this->db->get($this->table);
        //tra ve du lieu
        return $query->num_rows();
    }

    /**
    * Lay danh sach
    */
    function get_list($input = array())
    {
                //gắn các tùy chọn nếu có
        $this->get_list_set_input($input);
        //thuc hien truy van du lieu
        $query = $this->db->get($this->table);
                //tra ve du lieu
        return $query->result();
    }

    /**
    * Gan cac thuoc tinh trong input khi lay danh sach
    */
    protected function get_list_set_input($input)
    {
         // Select
	 if (isset($input['select']))
	 {
	      $this->db->select($input['select']);
	 }
        // Thêm điều kiện cho câu truy vấn truyền qua biến $input['where']

        if ((isset($input['where'])) && $input['where'])
        {
            $this->db->where($input['where']);
        }
                // Thêm sắp xếp dữ liệu thông qua biến $input['order'] (ví dụ $input['order'] = array('id','DESC'))
        if (isset($input['order'][0]) && isset($input['order'][1]))
        {
            $this->db->order_by($input['order'][0], $input['order'][1]);
        }
        else
        {
            //mặc định sẽ sắp xếp theo id giảm dần
            $this->db->order_by('id', 'desc');
        }

        // Thêm điều kiện limit cho câu truy vấn thông qua biến $input['limit'] (ví dụ $input['limit'] = array('10' ,'0'))
        if (isset($input['limit'][0]) && isset($input['limit'][1]))
        {
            $this->db->limit($input['limit'][0], $input['limit'][1]);
        }

    }

    /**
    * kiểm tra sự tồn tại của dữ liệu theo 1 điều kiện nào đó
    */
    function check_exists($where = array())
    {
         $this->db->where($where);
         //thuc hien cau truy van lay du lieu
         $query = $this->db->get($this->table);
     
         if($query->num_rows() > 0){
            return TRUE;
         }else{
            return FALSE;
         }
    }
}

Kết thúc bài bài: Qua bài hướng dẫn này các bạn hoàn toàn có thể tự xây dựng cho mình main Model cho riêng mình.Đây là phần khá quan trọng và lợi ích mang lại rất lớn nếu như các bạn biết cách xây dựng nó một cách hợp lỹ.Nó sẽ giúp cho code của các bạn dễ quản lý,ngắn gon hơn.



09/09/2014
Written by nobitacnt

Trong bài viết không tránh khỏi những câu từ chưa chính xác,mong nhận được sự góp ý để website hoàn thiện hơn.Nếu thấy bài viết có ích với bạn hãy like và share để ủng hộ nhé :D.

Bài viết chùng chuyên mục

16 Comments

  1. Kun Nguyen says:
     /  Reply

    Giờ mình muốn join 2 hoặc nhiều bảng với nhau thì làm thế nào trong MY_Model.

    • nobitacnt says:
       /  Reply

      Chào bạn,với phần join bảng này bạn có thể tạo thêm khóa nữa trong $input,ví dụ mình chỉnh sửa lại hàm get_list() 1 chút:

      //gắn các tùy chọn nếu có
      $this->get_list_set_input($input);
      //nếu có join tới bảng khác
      if(isset($input[‘join’]))
      {
      $this->db->from($this->table);
      foreach ($input[‘join’] as $table)
      {
      $this->db->join($table, $this->table.”.{$table}_id = {$table}.id”, ‘left’);
      }
      $query = $this->db->get();
      }else{
      $query = $this->db->get($this->table);
      }
      //tra ve du lieu
      return $query->result();

      Như vậy khi muốn join tới bảng này thì bạn chỉ cần sử dụng thêm biến $input['join'],đây chính là mảng các bảng muốn join.Ví dụ mình có 2 bảng là product (catalog_id,name,price) và bảng catalog(id,name),Như vậy khi muốn join bảng product với bảng catalog thì bạn có thể sử dụng $input['join'] = array('catalog'),còn bạn muốn lấy những cột trong bảng nào thì chỉ cần sử dụng $input['select'](ví dụ $input['select']= "product.id,product.name,catalog.name AS catalog_name").Nói chung phần là có rất nhiều cách,mình chỉ đưa ra 1 ví dụ nhỏ thôi,bạn có thể tùy chỉnh để linh hoạt hơn và làm được nhiều hơn thế nữa.Có gì cứ comment mình sẽ giải đáp.Thanks

      • Kun Nguyen says:
         /  Reply

        $input[‘join’] = array(‘catalog’) để bên controller hay model vậy thớt. mình làm mà nó không chạy :(

      • Kun Nguyen says:
         /  Reply

        Mình làm được rồi. Thanks thớt nhé ^^

        • nobitacnt says:
           /  Reply

          Nếu những lỗi từ câu lệnh truy vấn mà bạn chưa tìm ra nguyên nhân thì trong model sau câu lệnh truy vấn hãy sử dụng echo $this->db->last_query() để in ra câu lệnh sql xem thế nào nhé.Đó cũng là cách bug lỗi nhanh.

  2. Kun Nguyen says:
     /  Reply

    Cảm ơn chủ thớt :)
    Có gì không hiểu mình sẽ hỏi tiếp ^^

    • nobitacnt says:
       /  Reply

      Ok,có gì cứ để lại comment trong bài viết mình sẽ cố gắng giải đáp.Thanks

  3. Trung says:
     /  Reply

    Admin oi!!
    Cho minh hoi ham function check_exists ($where) sao khong co trong MY_Model nhi???
    Minh ko thay co…Mong nhan dc hoi am cua ban.

    • nobitacnt says:
       /  Reply

      bạn có thể viết hàm này nhu sau:

      	/**
      	 * kiểm tra sự tồn tại của dữ liệu theo 1 điều kiện nào đó
      	 */
          function check_exists($where = array())
          {
      	    $this->db->where($where);
      	    //thuc hien cau truy van lay du lieu
      		$query = $this->db->get($this->table);
      		
      		if($query->num_rows() > 0){
      			return TRUE;
      		}else{
      			return FALSE;
      		}
      	}
      
      • Trung says:
         /  Reply

        Cam on vi ban da hoi am comment cua minh..Cam on nhieu.

  4. vinamichi says:
     /  Reply

    Sao trong MY_model em không thấy hàm khởi tạo ạ?
    function __contruct(){
    parent::__construct();
    }
    việc này có ảnh hưởng gì không ạ?

    • nobitacnt says:
       /  Reply

      Khi bạn kế thừa từ CI_Model là nó đã kế thừa tất cả phương thức trong CI_Model rồi,còn nếu trong trường hợp mà bạn cần viết hàm __contruct() trong MY_Model thì bắt buộc phải sử dụng parent::__construct(); để kế thừa lại hàm __contruct() và nó tránh việc ghi đè.

  5. Ngọc DƯơng says:
     /  Reply

    anh ơi của em sau khi làm thì nó thông lỗi này ạ, em ko biết sửa như nào

    An Error Was Encountered
    Your D:\xampp\htdocs\BookVietOnline\application\config/database.php file does not appear to contain a valid configuration array.

    Giúp em với. Em cảm ơn ạ

    • Hoàng văn Tuyền says:
       /  Reply

      Bạn kiếm tra lại cấu hình trong file D:\xampp\htdocs\BookVietOnline\application\config/database.php

      • Ngọc Dương says:
         /  Reply

        Đây là nội dung e cấu hình trong file database.php, em đã kiểm tra tên csdl với em thêm cổng port mà vẫn ko được
        $active_group = ‘default’;
        $query_builder = TRUE;

        /*$db[‘default’][‘port’] = 8080;*/

        $db[‘default’] = array(
        ‘dsn’ => ”,
        ‘hostname’ => ‘localhost’,
        ‘username’ => ‘root’,
        ‘password’ => ”,
        ‘database’ => ‘bookvietonline’,
        ‘dbdriver’ => ‘mysqli’,
        ‘dbprefix’ => ”,
        ‘pconnect’ => FALSE,
        ‘db_debug’ => (ENVIRONMENT !== ‘production’),
        ‘cache_on’ => FALSE,
        ‘cachedir’ => ”,
        ‘char_set’ => ‘utf8’,
        ‘dbcollat’ => ‘utf8_general_ci’,
        ‘swap_pre’ => ”,
        ‘encrypt’ => True,
        ‘compress’ => True,
        ‘stricton’ => FALSE,
        ‘failover’ => array(),
        ‘save_queries’ => TRUE,
        ‘port’ => 8080
        /* $this -> load -> database ( $config )*/
        );

  6. Hùng says:
     /  Reply

    Bạn ơi, sao video không xem được vậy

Gửi bình luận

Giới thiệu

Mình tạo ra blog này với mong muốn chia sẻ và học hỏi kinh nghiệm trong quá trình thiết kế website. Website đang trong quá trình phát triển chân thành cảm ơn mọi sự góp ý của các bạn để làm cho website ngày càng hoàn thiên.

DMCA.com Protection Status
Theo dõi qua Email

Tổng hợp các bài viết về

Hoc php - CodeIgniter Framework - Laravel Framework - PHP va MYSQL