2014-02-11 4 views
1

Я хотел бы получить опыт MVC на следующее:Лучшие практики: Модели и контроллеры

У меня есть таблица, где я говорю, который user_id в котором group_id и второй стол, где я говорю, который user_id имеет какой user_name ,

Теперь я хочу функцию, с которой я передаю group_id, и она дает мне все user_name s в группе.

Вопрос заключается в том, что делает Д.О. контроллер и то, что модель:

  1. контроллер вызывает модель (get_user_ids_from_group), который возвращает идентификаторы пользователей, а затем контроллер вызывает другую модель (get_user_name_by_id), чтобы вернуть имена пользователей.

  2. Контроллер вызывает модель (`get_user_names_from_group), и модель внутренне получает сначала идентификаторы пользователя, а затем имена пользователей.

Я понимаю, что первый способ - это больше, чем MVC. Но насколько строго вы бы оказались в таком случае? Прямо сейчас я всегда очень строг.

В результате мои функции модели всегда имеют только две строки (запрос и возврат), а мой контроллер больше. Чтобы сделать контроллер и размер модели более равными, второй вариант был бы возможен.

+1

Ни ваших предложенных подходов придерживается шаблона MVC. –

ответ

0

В модели MVC не должно использоваться только для хранения и получения данных, но также должно содержать бизнес-логику.

Controller - Если принимать входной сигнал связи с моделью и представлением

Модель - Должен содержать бизнес-логику и хранилище данных

View - только для вывода

Так его, как Input -> Process -> Output

Кроме того, его зависит от вас, куда поставить, и у вас должен быть код баланса на контроллере и модели. Не пишите все в контроллере или в модели

В вашем случае я думаю, вы должны использовать get_user_names_from_group и просто передать имя группы и сделать запрос соединения между двумя таблицами. И когда вы определяете свою функцию в модели, она дает вам возможность повторно использовать функцию снова, если вам нужно то же самое на следующем контроллере.

2

На самом деле, это не имеет никакого отношения к MVC, как CodeIgniter doesn't implement MVC, но своего рода MVP.

Однако, если вы используете СУБД, такие как MySQL, вы можете JOIN эти две таблицы (в модели) и получить результат (в контроллере), как я предложил в a similar topic на SO.

приложение/модели/пользователь.PHP

class User extends CI_Model 
{ 
    public function get_users_by_group($group_id) 
    { 
     $this->db->select('*')->from('groups'); 
     // While group_id and user_id have a N:1 relation 
     $this->db->where('group_id', $group_id); 
     $this->db->join('users', 'users.user_id = groups.user_id'); 
     $query=$this->db->get(); 
     return $query->result_array(); 
    } 
} 

Затем извлечь и передать результат в контроллере: не

приложение/контроллеры/users.php

class Users extends CI_Controller 
{ 
    public function view($group_id) 
    { 
     $this->load->model('user'); 
     // Fetch the result from the database 
     $data['users'] = $this->user->get_users_by_group($group_id); 
     // Pass the result to the view 
     $this->load->view('users_view', $data); 
    } 
} 
0

Общий пример модели:

<?php 
    class Common_model extends CI_Model { 

     function get_entry_by_data($table_name, $single = false, $data = array(), $select = "", $order_by = '', $orderby_field = '', $limit = '', $offset = 0, $group_by = '') { 

      if (!empty($select)) { 
       $this->db->select($select); 
      } 

      if (empty($data)) { 

       $id = $this->input->post('id'); 

       if (!$id) 
        return false; 

       $data = array('id' => $id); 
      } 
      if (!empty($group_by)) { 

       $this->db->group_by($group_by); 
      } 


      if (!empty($limit)) { 
       $this->db->limit($limit, $offset); 
      } 

      if (!empty($order_by) && !empty($orderby_field)) { 

       $this->db->order_by($orderby_field, $order_by); 
      } 

      $query = $this->db->get_where($table_name, $data); 

      $res = $query->result_array(); 

      //echo $this->db->last_query();exit; 

      if (!empty($res)) { 

       if ($single) 
        return $res[0]; 
       else 
        return $res; 
      } else 
       return false; 
     } 


    public function get_entry_by_data_in($table_name, $single = false, $data = array(), $select = "", $order_by = '', $orderby_field = '', $limit = '', $offset = 0, $group_by = '',$in_column='',$in_data=''){ 



      if (!empty($select)) { 
       $this->db->select($select); 
      } 

      if (empty($data)) { 

       $id = $this->input->post('id'); 

       if (!$id) 
        return false; 

       $data = array('id' => $id); 
      } 
      if (!empty($group_by)) { 

       $this->db->group_by($group_by); 
      } 


      if (!empty($limit)) { 
       $this->db->limit($limit, $offset); 
      } 

      if (!empty($order_by) && !empty($orderby_field)) { 

       $this->db->order_by($orderby_field, $order_by); 
      } 

      if (!empty($in_data) and !empty($in_column)) { 
       $this->db->where_in($in_column,$in_data); 
      } 

      $query = $this->db->get_where($table_name, $data); 

      $res = $query->result_array(); 

      //echo $this->db->last_query();exit; 

      if (!empty($res)) { 

       if ($single) 
        return $res[0]; 
       else 
        return $res; 
      } else 
       return false; 

    } 
     public function getAllRecords($table, $orderby_field = '', $orderby_val = '', $where_field = '', $where_val = '', $select = '', $limit = '', $limit_val = '') { 

      if (!empty($limit)) { 
       $offset = (empty($limit_val)) ? '0' : $limit_val; 
       $this->db->limit($limit, $offset); 
      } 
      if (!empty($select)) { 

       $this->db->select($select); 
      } 
      if ($orderby_field) 
       $this->db->order_by($orderby_field, $orderby_val); 

      if ($where_field) 
       $this->db->where($where_field, $where_val); 

      $query = $this->db->get($table); 

      //return $query->num_rows; 
      //echo $this->db->last_query(); 
      if ($query->num_rows > 0) { 
       return $query->result_array(); 
      } 
     } 

     function alldata($table) { 
      $query = $this->db->get($table); 
      return $query->result_array(); 
     } 

     function alldata_count($table, $where) { 
      $query = $this->db->get_where($table, $where); 
      return $query->num_rows(); 
     } 

     function insert_entry($table, $data) { 
      $this->db->insert($table, $data); 
      return $this->db->insert_id(); 
     } 



     function update_entry($table_name, $data, $where) { 
      return $this->db->update($table_name, $data, $where); 
     } 

     public function get_data_by_join($table, $table2, $where, $table1_column, $table2_column, $limit = '', $order_column = '', $order_by = 'DESC', $select_columns = '', $is_single_record = false, $group_by = '', $join_by = '', $offset = '') { 
      if (!empty($select_columns)) { 
       $this->db->select($select_columns); 
      } else { 
       $this->db->select('*'); 
      } 

      $this->db->from($table); 
      $this->db->join($table2, $table . '.' . $table1_column . '=' . $table2 . '.' . $table2_column, $join_by); 
      $this->db->where($where); 
      if (!empty($limit)) { 
       if (!empty($offset)) { 
        $this->db->limit($limit, $offset); 
       } else { 
        $this->db->limit($limit); 
       } 
      } 
      if (!empty($order_column)) { 
       $this->db->order_by($order_column, $order_by); 
      } 

      if (!empty($group_by)) { 
       $this->db->group_by($group_by); 
      } 

      $query = $this->db->get(); 
      if ($query->num_rows() > 0) { 

       if ($is_single_record) { 
        $rs = $query->result_array(); 
        return $rs[0]; 
       } else { 
        return $query->result_array(); 
       } 
      } else { 
       return false; 
      } 
     } 

     function DeleteRecord($table_name, $where) { 
      return $this->db->delete($table_name, $where); 
     } 

     function managerecord() { 
      $count = 1; 
      $where = array('channel_id' => 8, 
       'field_id_12 !=' => ''); 
      $this->db->where($where); 
      $query = $this->db->get('channel_data'); 
      $data = $query->result_array(); 
      foreach ($data as $value) { 
       $id = $value['field_id_12']; 
       $update = array('telephone' => $value['field_id_53'], 
        'about' => $value['field_id_54'], 
        'license' => $value['field_id_18'], 
        'broker' => $value['field_id_19'], 
        'preferred' => 'yes'); 
       $this->db->update('members', $update, array('member_id' => $id)); 
      } 
      echo "done1"; 
     } 

     public function get_content_landing_page($table = false, $field = false, $id = false, $id_name = false) { 
      $this->db->select($field); 
      $this->db->from($table); 
      $this->db->where($id_name, $id); 
      $query = $this->db->get(); 
      return $query->result_array(); 
     } 

     public function get_field_landing_page($id = false,$fields=false) { 
      $this->db->select($fields); 
      $this->db->from('terratino_form_fields_master'); 
      $this->db->where('id', $id); 
      $query = $this->db->get(); 
      return $query->result_array(); 
     } 

    } 


    ?> 
Смежные вопросы