模型

模型对于那些想用传统MVC方式的人来说是可选的。

什么是模型?

模型是专门用来和数据库打交道的PHP类。例如,假设你想用CodeIgniter来做一个Blog。你可以写一个模型类,里面包含插入、更新、删除Blog数据的方法。下面的例子将向你展示一个普通的模型类:

  1. class Blogmodel extends CI_Model {
  2. var $title = '';
  3. var $content = '';
  4. var $date = '';
  5. function __construct()
  6. {
  7. parent::__construct();
  8. }
  9. function get_last_ten_entries()
  10. {
  11. $query = $this->db->get('entries', 10);
  12. return $query->result();
  13. }
  14. function insert_entry()
  15. {
  16. $this->title = $_POST['title']; // 请阅读下方的备注
  17. $this->content = $_POST['content'];
  18. $this->date = time();
  19. $this->db->insert('entries', $this);
  20. }
  21. function update_entry()
  22. {
  23. $this->title = $_POST['title'];
  24. $this->content = $_POST['content'];
  25. $this->date = time();
  26. $this->db->update('entries', $this, array('id' => $_POST['id']));
  27. }
  28. }
注意: 上面用到的函数是 [Active Record](https://codeigniter.org.cn/userguide2/database/active_record.html) 数据库函数. **备注:** 为了简单一点,我们直接使用了$_POST。不过,这不太好,平时我们应该使用 [输入类]($852c6e5719a75e38.md):$this->input->post('title') ## 剖析模型 模型类文件存放在 _application/models/_ 文件夹。 如果你愿意,可以在里面建立子文件夹。 最基本的模型类必须像这样:
  1. class Model_name extends CI_Model {
  2. function __construct()
  3. {
  4. parent::__construct();
  5. }
  6. }
_Model_name_ 是模型类的名字。 类名的首字母**必须**大写,其他字母小写。并且确保你的类继承了基本模型类(Base Model Class)。 文件名应该是模型类名的小写版。比如,如果你的类是:
  1. class User_model extends CI_Model {
  2. function __construct()
  3. {
  4. parent::__construct();
  5. }
  6. }
类的文件名应该是:
  1. application/models/user_model.php

载入模型

模型可以在 控制器 中被引用。就像这样:

  1. $this->load->model('Model_name');
如果模型文件在子文件夹下,引用的时候要带上相对路径名。例如:如果你有一个模型 _application/models/blog/queries.php_。下面的代码可以引用它:
  1. $this->load->model('blog/queries');
模型一旦被载入,你就能通过下面的方法使用它:
  1. $this->load->model('Model_name');
  2. $this->Model_name->function();
在默认的情况下模型名称就直接被引入作为对象名,就如上面所示。当然,如果你愿意,可以起个更好记的对象名!那么,可以在加载模型函数中指定第二个参数来设定,例如:
  1. $this->load->model('Model_name', 'fubar');
  2. $this->fubar->function();
这里有个控制器的例子,加载一个模型,然后通过视图显示出来
  1. class Blog_controller extends CI_Controller {
  2. function blog()
  3. {
  4. $this->load->model('Blog');
  5. $data['query'] = $this->Blog->get_last_ten_entries();
  6. $this->load->view('blog', $data);
  7. }
  8. }

自动载入模型

如果您需要一个在整个项目中都起作用的特定模型,您可以让 CodeIgniter 在初始化时自动装载它。实现的方法是打开 application/config/autoload.php 文件,然后在自动装载数组中添加上这个模型。

备注: 经过测试(以加载一个模型为例)自动加载模型和手动载入模型时,消耗的内存情况是一样的!但是当加载模型越多消耗内存就会越大。自动加载模型是要牺牲内存消耗换取的,所以尽量不要自动加载不必要贯穿全站项目的模型!

连接到数据库

当一个模型被载入时,它并不会自动连接数据库。以下方法可以使您连接数据库:

  • 您可以使用标准方法来连接数据库(说明), 也可以通过控制器或者您的自定义模型。
  • 您可以把第三个参数设置为TRUE来使模型装载函数自动连接数据库,连接配置可以在您的数据库配置文件中可以定义:
    1. $this->load->model('Model_name', '', TRUE);
  • 您可以手动设定第三个参数来载入您的自定义数据库配置:
    1. $config['hostname'] = "localhost";$config['username'] = "myusername";$config['password'] = "mypassword";$config['database'] = "mydatabase";$config['dbdriver'] = "mysql";$config['dbprefix'] = "";$config['pconnect'] = FALSE;$config['db_debug'] = TRUE;$this->load->model('Model_name', '', $config);
    备注: 经过友好链接测试(也即只连接数据库不涉及查询),自动连接数据库和手动连接数据库时,消耗的内存情况是一样的,我本人的本机测试是0.67M

翻译贡献者:analyzer, crazyant_ps2, Hex, levin, liuhuyydy, li_star, longbill, longjianghu, ripen, shishirui, soyota, tinsn