codeigniter 最佳实践:模型和控制器

vxf3dgd4  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(86)

我有一个表,我说哪个user_id在哪个group_id中,还有一个表,我说哪个user_id有哪个user_name
现在我想要一个函数,我传递一个group_id,它给我组中所有的user_name
控制器做什么,模型做什么:
1.控制器调用一个Model(get_user_ids_from_group)返回用户ID,然后控制器调用不同的Model(get_user_name_by_id)返回用户名。
1.一个控制器调用一个模型(`get_user_names_from_group),模型首先在内部获取用户id,然后获取用户名。
我知道第一种方式更加严格,但是在这种情况下你会有多严格呢?现在我总是非常严格。
因此,我的模型函数总是只有两行(查询和返回),我的控制器更大。所以,使控制器和模型大小更相等的第二个选择是可能的。

iq3niunx

iq3niunx1#

在MVC模式中,不应该只用于存储和获取数据,还应该包含业务逻辑。
控制器-应该接受输入,与模型和视图通信
模型-应包含业务逻辑和数据存储
视图-仅用于输出
就像Input -> Process -> Output
它也取决于你在哪里把什么,你应该有一个平衡的控制器和模型的代码,而不是写在控制器或模型的一切
在你的例子中,我认为你应该使用get_user_names_from_group,只需要传递组名并在两个表之间进行连接查询。当你在模型中定义你的函数时,它给予你再次重用函数的选项,以防你在下一个控制器上需要同样的东西。

rlcwz9us

rlcwz9us2#

常见模型示例:

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

    }

    ?>

字符串

xkrw2x1b

xkrw2x1b3#

实际上,它与MVC无关,因为CodeIgniter没有实现MVC,而是一种MVP
然而,如果你使用的是关系型数据库管理系统,比如MySQL,你可以JOIN这两个表(在模型中)并获取结果(在控制器中),就像我在SO上的a similar topic中建议的那样。

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

字符串
然后在Controller中获取并传递结果:

application/controllers/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);
    }
}

相关问题