2010/02/08

[CodeIgniter] 使用Model

先說明一下:我也是第一次使用Model的概念來寫,所以有錯或不正確請多包涵!


Model
在上一篇表單的製作中,發現Controller可能會夾雜大量的SQL語法來讀取資料
所以使用Model來讓流程控制與資料庫溝通部分切開

此例中有兩個主要表格:活動跟報名資料
於是我針對這兩個表格分為幾個操作
活動資料表會有:
  1. 取得單筆活動資料  <= 像是報名頁面要顯示該活動資訊
  2. 取得所有紅動資料  <= 像是首頁顯示所有的活動列表
  3. 新增/修改/刪除 活動     <= 管理者用

報名資料表會有:

  1. 取得一個人的報名資料
  2. 取得一活動的所有報名人資料
  3. 取得一活動的報名人數   <= 這個與第二項很類似
  4. 新增/修改/刪除 報名資料
目前想到有大概這樣的功能需求,以下是寫個很陽春的程式碼
mevent.php
Class Mevent extends Model{
 function mevent(){
  parent::Model();
 }
  
 function get_all(){
  $query = $this->db->get('event');
  foreach($query->result_array() as $row){
   $data[] = $row;
  }
  return $data;
 }
  
 function get_one($sn){
  $query = $this->db->get_where('event',array('sn'=>$sn));
  return $query->row_array();
 }
  
 function add(){
  $sql_data = array(
      'topic'      => $this->input->post('topic'),
      'desc'          => $this->input->post('desc'),
      'start_time' => $this->input->post('start_time'),
      'end_time'      => $this->input->post('end_time'),
      'joiner_no'  => intval($this->input->post('joiner_no'))
     );
  if( $this->db->insert('event',$sql_data) ){
   return $this->db->insert_id();
  }else{
   return flase;
  }          
 }
  
 function update($sn){
  $sql_data = array(
      'topic'      => $this->input->post('topic'),
      'desc'          => $this->input->post('desc'),
      'start_time' => $this->input->post('start_time'),
      'end_time'      => $this->input->post('end_time'),
      'joiner_no'  => intval($this->input->post('joiner_no'))
     );
  $this->db->where('sn',$sn);
  return $this->db->update('event',$sql_data);
 }
  
 function delete($sn){
  return $this->db->delete('event',array('sn',$sn));
 }
}

mjoiner.php
Class Mjoiner extends Model{
 function Mjoiner(){
  parent::Model();
 }
 function get_one($sn){
  $this->db->select('joiner.* , event.topic');
  $this->db->join('event','joiner.event_sn = event.sn');
  $query = $this->db->get_where('joiner',array('joiner.sn' => $sn) );
  return $query->row_array();
 }
 function get_byevent($event_sn){
  $this->db->order_by('sn','asc');
  $query = $this->db->get_where('joiner', array('event_sn' => $event_sn));
  if( $query->num_rows() ){
   foreach($query->result_array() as $row){
    $data[] = $row;
   }
   return $data;
  }else{
   return null;
  }
 }
 function getpno_byevent($event_sn){
  $query = $this->db->get_where('joiner', array('event_sn' => $event_sn));
  return $query->num_rows();
 }
 function add(){
  $sql_data = array(
     'name'          => $this->input->post('name'),
     'sex'         => $this->input->post('sex'),
     'mobile'     => $this->input->post('mobile'),
     'event_sn'     => $this->input->post('event_sn'),
     'time'         => date('Y-m-d H:i:s')
     );
  if( $this->db->insert('joiner',$sql_data) ){
   return $this->db->insert_id();
  }else{
   return false;
  }          
 }
 function update($sn){
  $sql_data = array(
     'name'         => $this->input->post('name'),
     'sex'         => $this->input->post('sex'),
     'mobile'     => $this->input->post('mobile'),
     'event_sn'     => $this->input->post('event_sn')
     );
  $this->db->where('sn',$sn);
  return $this->db->update('joiner',$sql_data);          
 }
 function delete($sn){
  return $this->db->delete('joiner',array('sn',$sn));
 }
}

為了區別這是Model,我在首字上都加上'm'表示

修改Controller
寫好後請回到Controller
在function signup() 內加入
$this->load->model( 'mevent' );
如果想一次讀取多的Model,可在參數內傳入Array
$this->load->model( array('mevent','mjoiner') );
載入後,就可使用$this->mevent->函數(); 取得資料

完成Model後,就可以把先前在Controller內存取DB的部份取代
function index() :
$data['event'] = $this->db->get('event');  =>  $data['event'] = $this->mevent->get_all();   
function join() :
$this->db->select('topic');
$query = $this->db->get_where('event', array('sn' => $this->uri->segment(3) ) );
$row = $query->row();
$data['event_name'] = $row->topic;
$query = $this->mevent->get_one( $this->uri->segment(3) );
$data['event_name'] = $query['topic'];

這樣是不是可以把操作DB的部分從Controller轉到Model了

修改View
照理說應該跟VIEW沒關係,但是開始寫的時候是把查詢後的物件直接丟給VIEW做處理
但是轉給MODEL後是回傳多維陣列,需要做些修改
View: home.php
<?php if( $event->num_rows() > 0 ):?>
<?php foreach($event->result() as $row):?>
<?php if( count($event) > 0 ):?>
<?php foreach($event as $row):?>

其中的變數需要從物件存取改為陣列存取
<?php echo $row->sn; ?> => <?php echo $row['sn']; ?>

沒有留言:

張貼留言