Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在CodeIgniter中使用模型_Php_Codeigniter - Fatal编程技术网

Php 在CodeIgniter中使用模型

Php 在CodeIgniter中使用模型,php,codeigniter,Php,Codeigniter,有人能给我解释一下什么时候在CI中使用模型是一种好的做法吗? 维基百科上的一篇文章将CI模型称为“完全可选且很少需要”这是真的吗?否!!那不是真的。模型用作控制器和数据库之间的层。MVC最佳实践充其量只是一个主观问题。人们以不同的方式使用它。像CodeIgniter这样的框架非常好,因为它允许这种级别的灵活性。其他框架则要严格得多。 一般来说,我尽量保持我的控制器非常小和具体,并在模型中放入大量代码(db交互和解析结果等) 一个“模型”代表数据,很可能来自数据库(也就是说,您的行从数据库返回,模

有人能给我解释一下什么时候在CI中使用模型是一种好的做法吗?
维基百科上的一篇文章将CI模型称为“完全可选且很少需要”这是真的吗?

否!!那不是真的。模型用作控制器和数据库之间的层。MVC最佳实践充其量只是一个主观问题。人们以不同的方式使用它。像CodeIgniter这样的框架非常好,因为它允许这种级别的灵活性。其他框架则要严格得多。
一般来说,我尽量保持我的控制器非常小和具体,并在模型中放入大量代码(db交互和解析结果等)

一个“模型”代表数据,很可能来自数据库(也就是说,您的行从数据库返回,模型保存发送数据)。没有必要使用CI提供的数据库层-这是事实-如果您愿意,您可以用另一个数据库层替换,但它们“很少使用”根本不是事实。

您应该使用模型来避免复制代码(不要重复您自己)。我认为大多数(几乎所有)使用codeigniter构建的应用程序都会使用某种模型

也许本文所指的是activerecord类,它在模型中是可选的。我发现活动记录对于创建、更新和删除都很好,但对于任何稍微复杂的读取,您很可能需要sql。值得注意的是,模型中使用的不仅仅是数据库。可以在模型中使用Web服务或平面文件或任何数据源


我一直认为模型只是一个数据库层。不应该这样,这会在控制器中造成膨胀。使用fat控制器最终会减慢速度。如果可以的话,将整个模型结构放在模型中,并简单地将控制器用于逻辑。

模型用于MVC框架中的业务逻辑(在理想情况下..可能会引起争论,有些人将业务逻辑放在控制器中)和DB连接

阅读codeigniter用户指南了解更多关于型号的信息


假设您需要调用一个名为
get\u user\u info
的函数,该函数从数据库检索用户信息。您可以使用如下函数:

class Home extends Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        $user = $this->get_user_info($_SESSION['user_id']);
        echo "Hello " . $user['first_name'];
    }

    function get_user_info($user_id) {
        $query = $this->db->query("SELECT * FROM users WHERE user_id = ?", array($user_id));
        return $query->row_array();
    }
}
但是,如果您需要在另一个页面上调用
get\u user\u info
,该怎么办

在这种情况下,您必须将该函数复制并粘贴到每个页面中,这样,如果您有很多页面,就很难进行维护(如果您需要更改查询以连接到另一个表怎么办?)

这也违反了原则

模型用于处理所有数据逻辑和表示,返回已经加载到视图中的数据。最常见的是,它们被用作将数据库功能分组在一起的一种方式,这样您就可以更轻松地更改它们,而无需修改所有控制器

class User extends Model {

    function __construct() {
        parent::Model();
    }

    function get_user_info($user_id) {
        $query = $this->db->query("SELECT * FROM users WHERE user_id = ?", array($user_id));
        return $query->row_array();
    }

}
在上面,我们现在创建了一个名为
user
的模型。在我们的家庭控制器中,我们现在可以将代码更改为:

class Home extends Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        $this->load->model('user');
        $user = $this->user->get_user_info($_SESSION['user_id']);
        echo "Hello " . $user['first_name'];
    }
}

现在,您可以更改
get\u user\u info
函数,而无需更改依赖于相同函数的X个控制器。

有一个称为“胖模型/瘦控制器”的原则,您可能希望了解这一原则,它表明处理的权重应该在模型文件中完成,而不是在控制器。这支持了上面@fire所概述的“不要重复自己”原则,并促进了重复使用

我发现使用这个原则,我最终得到了一组通用的、可重用的控制器,每个控制器使用一组可重用的模型,偶尔,每个站点只使用一次特定于项目的控制器。除此之外,我还有模型之间的交叉依赖性。如果不遵循上述原则并在模型中封装尽可能多的处理,我将无法像以前那样频繁地重复使用

这个主题在网上有很多讨论,所以有很多信息要看,但似乎在代码点火器板上,它是由更有经验的用户推荐的


我必须补充的是,“完全可选且很少需要”通常不是这样,我要说的是,除了最简单的情况外,这在任何情况下都是完全错误的-最简单的情况是静态页面,它不与数据库集成,只包含一些加载的视图,但是,即使使用具有中函数的模型来检索每个页面的公共视图集也是可取的。

这个我的大型模型有很多方法。

class Shortcode\u模型扩展了CI\u模型{
公共函数构造(){
父项::_构造();
$this->load->library('session');
}
/**
*杂项功能
*/
/**
*读取关键字。
*
*@返回无效
*@作者钦塔卡
**/
公共函数读取($id){
$this->db->select();
$this->db->from('short_code');
$this->db->where('id',$id);
$query=$this->db->get();
$result=$query->row();
$shortcode=newstdclass();
$shortcode->id=$result->id;
$shortcode->code=$result->code;
$shortcode->aggregator=$result->aggregator;
$shortcode->mo\u pp\u id=$result->mo\u pp\u id;
$shortcode->mt\u free\u pp\u id=$result->mt\u free\u pp\u id;
$shortcode->mt\u bill\u pp\u id=$result->mt\u bill\u pp\u id;
$shortcode->partner\u role\u id=$result->partner\u role\u id;
$shortcode->partner\u role\u pass=$result->partner\u role\u pass;
$shortcode->product\u id=$result->product\u id;
$shortcode->billable=$result->billable;
//$shortcode->created=$result->created;
//$shortcode->changed=$result->changed;
    class Shortcode_model extends CI_Model {

        public function __construct() {
            parent::__construct();
            $this -> load -> library('session');
        }

        /**
         * Misc functions
         */

        /**
         * read keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function read($id) {
            $this -> db -> select();
            $this -> db -> from('short_code');
            $this -> db -> where('id', $id);

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

            $result = $query -> row();

            $shortcode = new stdClass();

            $shortcode->id                  = $result->id;
            $shortcode->code                = $result->code;
            $shortcode->aggregator          = $result->aggregator;
            $shortcode->mo_pp_id            = $result->mo_pp_id;
            $shortcode->mt_free_pp_id       = $result->mt_free_pp_id;
            $shortcode->mt_bill_pp_id       = $result->mt_bill_pp_id;
            $shortcode->partner_role_id     = $result->partner_role_id;
            $shortcode->partner_role_pass   = $result->partner_role_pass;
            $shortcode->product_id          = $result->product_id;
            $shortcode->billable            = $result->billable;
            // $shortcode->created              = $result->created;
            // $shortcode->changed              = $result->changed;
            $shortcode->status              = $result->status;

            //print_r($shortcode);
            return $shortcode;

        }

        public function read_operator($telco_id){


            $this -> db -> select();
            $this -> db -> from('operator');
            $this -> db -> where('telco_id', $telco_id);

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

            $result = $query -> row();

            $operator = new stdClass();

            $operator->id               = $result->id;
            $operator->code             = $result->telco_id;
            $operator->name             = $result->telco_name;

            return $operator;


        }

        /**
         * create keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function create($arr_data) {
            $this -> db -> insert('short_code', $arr_data);
            //$stock['stock_id'] = $this->db->insert_id();

            //return $query->result();

            //return $keywords;

        }

        /**
         * update keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function update($arr_data) {
            $this -> db -> where('id', $arr_data['id']);
            $this -> db -> update('short_code', $arr_data);

        }

        /**
         * delete keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function delete($id) {
            $this -> db -> where('id', $id);
            $this -> db -> delete('short_code');

        }

        /**
         * get all enabled shortcodes stored in the database.
         *
         * @return $shortcodess
         * @author Chinthaka
         **/
        public function all_enable_shortcodes() {
            $this -> db -> select();
            $this -> db -> from('short_code');
            $this -> db -> where('status', 'enable');
            $this -> db -> order_by("code");

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

            $result = $query -> result_array();

            //echo mysql_num_rows($result);

            $shortcodes = array();

            foreach ($result as $row) {
                $shortcode = $this -> read($row['id']);
                array_push($shortcodes, $shortcode);
            }

            /*while($data = $this->db->call_function('fetch_row', $result )) {
             $shortcode =   $this->read($data['id']);
             array_push($shortcodes,$shortcode);
             }*/

            return $shortcodes;

        }

        /**
         * check shortcode is exist.
         *
         * @return boolean
         * @author Chinthaka
         **/
        function is_exists($shortcode, $id = 0) {

            $this -> db -> where('code', $shortcode);

            if ($id > 0) {
                $this -> db -> where('id <>', $id);
            }

            $query = $this -> db -> get('short_code');

            if ($query -> num_rows() > 0) {
                return true;
            } else {
                return false;
            }
        }

        public function get($short_code_id)
        {
            $query = $this->db->query('select * from short_code where id=?', array($short_code_id));
            log_message('debug', $this->db->last_query());
            return $query->row();
        }

    }