状态 草稿
Todo Clearer examples
官方最后更新时间 2008/09/10 17:52

模型(Models)

什么是模型?

模型是用于处理控制器分发信息的类。举个例子,你有一个留言板,控制器会要求模型显示当前最新的10条留言记录,模型返回这些留言到控制器上,控制器通过视图显示到浏览器上面,控制器也会发送新的留言记录给模型或者编辑,删除等操作。

注意 Kohana 不强迫你使用模型。使用不使用是你自己的自由!

命名模型

命名模型需要遵守 Kohana 下面的规则:

  • 模型必须放在 application/models/ 目录下面。
  • 模型文件名必须是小写,不需要使用 “_model” 后缀并且使用表名的单数形式。
  • 模型类名首字母大写,使用 “_Model” 后缀,并且使用表名的单数形式。
  • 如果继承 ORM 模拟,还有更具体的规则需要遵守。

实例

假设你的一个表的表名叫:users (这个是复述形式)。该模型代表了 users 表并把文件放在 application/models/user.php 且类名为 User_Model (均是单数形式)。

核心代码:

<?php defined('SYSPATH') or die('No direct script access.');
 
class User_Model extends Model {
 
	public function __construct()
	{
		// 加载数据库类。以下可以使用 $this->db 操作数据库(如果不要求可以省略)
		parent::__construct();
	}
 
}

加载模型

一般情况下,在控制器中加载模型。

例如,从 控制器加载 application/models/user.php 的用户模型(User_Model):

$user = new User_Model;
$name = $user->get_user_name($id);  // get_user_name 是 User_Model 中的方法

继承

如果从所有子控制器使用 Kohana 的 Template_Controller 需要访问模型,您可以添加以下到 Template_Controller 控制器中:

$this->user = new User_Model;

你可以从任何的控制器继承 Template_Controller 使用用户(user)模型:

$name = $user->get_user_name($id);  // get_user_name 是 User_Model 中的方法

废弃

下面示例使用的方法已经在 Kohana 2.1+ 被废弃。

// 模型名不需要_Model。
// 已经在 Kohana 2.1 被废弃。
$this->load->model('user');
$name = $this->user->get_user_name($id);

用法

模型示例:

class User_Model extends Model {
 
        public function __construct($id = NULL)
        {
               // 加载数据库类。以下可以使用 $this->db 操作数据库(如果不要求可以省略)
               parent::__construct($id);
        }
 
	/**
	 * 通过 user_id 获得用户信息。
	 * @param integer the user_id
	 * @return the result object
	 */
	public function get_user($user_id)
	{
		$this->db->where('user_id', $user_id);
		return $this->db->get('users');
	}
 
	/**
	 * 添加用户。userd_id 在数据库中设置的为自动添加。
	 * @param array user data. E.g.,
	 *	array( 'name' => 'test', 'email' => 'test@example.com' )
	 * @return void
	 */
	public function insert_user($data)
	{
		$this->db->insert('users', $data);
	}
 
	/**
	 * 更新用户资料。
	 * @param array user data. E.g.,
	 *	array( 'name' => 'test', 'email' => 'test@example.com' )
	 * @return void
	 */
	public function update_user($user_id, $data)
	{
		$this->db->where('user_id', $user_id);
		$this->db->update('users', $data);
	}
 
}

提示: 当从表单总是使用 $this→input→post('var_name', TRUE) 校验输入的数据是否符合正确格式时,请查看 输入库(Input Library)

模型里使用数据库

如果模型的构造器(constructor)包含 parent::__construct();,默认情况下数据库会被加载,并使用 $this→db 进行操作。

你也可以指定数据库组(database group) 在模型使用被保护的变量 $db

protected $db = 'group_name';

控制器中使用模型

使用上面的例子,你可以将此模型添加到控制器中:

  1. 在控制器中使用 $user = new User_Model 创建模型实例。 如果你希望它能在你继承于这个控制器的所有控制中都可用,你可以在控制构造函数中加入 $this→user = new User_Model
  2. 如果你在上面的实例中使用了构造函数,你可以从数据库检索用户信息: $user = $this→user→get_user(1)。现在 $user 变量包含一个数据库结果(用户 ID =1),你可以把它传递给视图(Views)
  3. 如果你传递 $user 变量到视图中去。你可以在视图中使用 $user→name。详细请参见 Database 库。

ORM

详细请参阅

ORM 是一个特殊的多样化模型。基于它可以获得样例表,也可以在模型中执行一些基础的方法(find($id)find_all_by_lastname),同时也能很好的支持表之间的关系模型。另一个方面 ORM 可以把数据库的记录转换为对象。

general/models.txt · 最后更改: 2008/11/05 17:47 由 icyleaf