| 状态 | 草稿 |
|---|---|
| Todo | Clearer examples |
| 官方最后更新时间 | 2008/09/10 17:52 |
模型是用于处理控制器分发信息的类。举个例子,你有一个留言板,控制器会要求模型显示当前最新的10条留言记录,模型返回这些留言到控制器上,控制器通过视图显示到浏览器上面,控制器也会发送新的留言记录给模型或者编辑,删除等操作。
注意 Kohana 不强迫你使用模型。使用不使用是你自己的自由!
命名模型需要遵守 Kohana 下面的规则:
application/models/ 目录下面。实例
假设你的一个表的表名叫: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';
使用上面的例子,你可以将此模型添加到控制器中:
$user = new User_Model 创建模型实例。 如果你希望它能在你继承于这个控制器的所有控制中都可用,你可以在控制构造函数中加入 $this→user = new User_Model$user = $this→user→get_user(1)。现在 $user 变量包含一个数据库结果(用户 ID =1),你可以把它传递给视图(Views)。详细请参阅
ORM 是一个特殊的多样化模型。基于它可以获得样例表,也可以在模型中执行一些基础的方法(find($id),find_all_by_lastname),同时也能很好的支持表之间的关系模型。另一个方面 ORM 可以把数据库的记录转换为对象。