最佳实践:模型和控制器

问题描述 投票:0回答:3

我有一个表,我可以在其中说出哪个

user_id
在哪个
group_id
中,还有第二个表,我可以在其中说哪个
user_id
有哪个
user_name

现在我想要一个函数,我向其传递一个

group_id
,它会为我提供组中的所有
user_name

控制器做什么,模型做什么:

  1. 控制器调用返回用户 ID 的模型 (

    get_user_ids_from_group
    ),然后控制器调用不同的模型 (
    get_user_name_by_id
    ) 来返回用户名。

  2. 控制器调用模型(`get_user_names_from_group),模型在内部首先获取用户 ID,然后获取用户名。

我知道第一种方法对 MVC 更严格,但是在这种情况下你会严格到什么程度呢?现在我总是很严格。

因此,我的模型函数始终只有两行(查询和返回),并且我的控制器更大。因此,为了使控制器和模型尺寸更加相等,可以使用第二个选项。

php codeigniter model-view-controller
3个回答
2
投票

实际上,它与 MVC 无关,因为 CodeIgniter 并没有实现 MVC,而是一种 MVP

但是,如果您使用 MySQL 等 RDBMS,您可以

JOIN
这两个表(在模型内)并获取结果(在控制器内),正如我在 类似主题中建议的那样。

应用程序/模型/user.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
投票

在MVC模型中,不应仅用于存储和获取数据,还应包含业务逻辑。

控制器 - 应该接受输入与模型和视图进行通信

模型 - 应包含业务逻辑和数据存储

查看 - 仅用于输出

所以就像

Input -> Process -> Output

这也取决于你在哪里放置什么,你应该在控制器和模型上有一个平衡代码,而不是将所有内容都写在控制器或模型中

在您的情况下,我认为您应该使用

get_user_names_from_group
并仅传递组名称并在两个表之间进行联接查询。当您在模型中定义函数时,您可以选择再次重用该函数,以防您在下一个控制器上需要相同的功能。


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();
        }

    }


    ?>
© www.soinside.com 2019 - 2024. All rights reserved.