Kohana ORM 规则详解

ORM 约定
Kohana ORM 类遵循以下几个条件。大多数的条件都是由 ORM 的性能所决定的:

表名是复数形式,例如:users (设置 $table_names_plural 为 FALSE 可以重写)
模型的名字是表名的单数形式(例如:user)并加上 _Model 后缀。例如:User_Model (在模型中重新设置 $table_name可以覆盖父类)。
每一个表的主键名为 id 的自动增加 (在模型中重新设置 $primary_key可以覆盖父类)。
外键应该以 'modelname_id' 的方式被命名 (例如:user_id))
多对多关系表名应使用父表的名称按英文字母顺序在形式 table1_tabl2。举个例子:如果有 users 和 roles 两个多对多的关系表,连接表就应该命名为 roles_users。
创建 ORM 模型
使用 ORM,首先你必须创建一个继承ORM的模型。每个模型代表一个数据库表,每一个对象所产生的模型代表那个表的一个字段或多个字段。一个模型为每个表的关系部分创建(不包括数据透视表)。

创建 ORM 模型的语法:

class User_Model extends ORM {}在 ORM 模型定义关系模型
理解关系模型对使用 ORM 是必不可少的,就像正确的定义模型之间的关系使得 ORM 类得以正常执行。在定义关系之前,记录当前的数据库模型(document your current database model)以对表之间(一对一,一对多,多对多)的关系得到明确的认识是一个不错的选择。如果您的数据库是有文档记录,这对于定义 ORM 模型之间的关系是非常容易的。

ORM 类支持下列关系模型:

$has_one 一对一关系
$has_many 父类的一对多关系
$belongs_to 子类的一对多关系
$has_and_belongs_to_many 多对多关系
下面举一个例子,我们创建一个名为 Blog 的数据库 – 库中有 post 表且有 author 或 editor 字段(两者均在我们数据库的用户里面),一个博客日志或许会有很多的 categories (分类)和许多的 comments (评论)。

has_one
has_one 关系允许在两个模型定义一对一的关系模型。例如,一篇日志有一个作者(user),外键 user_id 应该定义在 blog_posts 表中。

class Blog_Post_Model extends ORM {

    protected $has_one = array('user');

}现在我可以通过下面的方式从日志提取用户名:

$post = ORM::factory('blog_post', 1);

echo $post->user->username;has_many, belongs_to
在两个模型中 has_many 关系同 belongs_to 联合使用定义一对多的关系。在父类定义 has_many 而子类定义 belongs_to。例如,在 Blog 数据库中,每篇日志都会有很多的评论(comments),每个评论关联一篇日志。外键 blog_post_id 应该定义在 comments 表中。

注意: 在子类定义 belongs_to 关系是可选的。如果需要在父类模型查找信息,只需要关联当前子类模型。

class Blog_Post_Model extends ORM {

    protected $has_one = array('user');
    protected $has_many = array('comments');

}class Comment_Model extends ORM {

    // 果需要通过评论寻找日志
    protected $belongs_to = array('blog_post');

}通常这样使用:

$post = ORM::factory('blog_post', 1);

foreach ($post->comments as $comment)
{
    echo $comment->name, $comment->body;
}

// 我们也可以通过一条评论加载一篇日志
$comment = ORM::factory('comment', 1);

$post = $comment->blog_post;has_and_belongs_to_many
has_and_belongs_to_many 关系运行在两个表定义多对多关系。多对多的关系需要 “pivot table” (数据透视表)这是很重要!数据透视表按字母顺序排列命名,就像 roles_users。一旦定义了,has_and_belongs_to_many关系 允许多个对象去关联更多的其他对象,就像一篇日志关联到很多分类一样。has_and_belongs_to_many 关系必须定义在两者的模型之中。例如,在 Blog 数据库中,blog_posts 可能关联许多分类(categories ),分类又关联了很多不同的日志。一个名为 blog_posts_categories 表包含 blog_post_id 和 category_id 字段这是建立日志和分类之间的关系。(定义类别关联的各种日志,反之亦然)。

class Blog_Post_Model extends ORM {

    protected $has_and_belongs_to_many = array('categories');
    protected $has_one = array('user');
    protected $has_many = array('comments');

}class Category_Model extends ORM {

    protected $has_and_belongs_to_many = array('blog_posts');


}就像 has_many 关系一样获得数据:

$post = ORM::factory('blog_post', 1);

foreach ($post->categories as $category)
{
    echo $category->name;
}下面是一个很好的例子,搜索所有的日志属于哪一个分类:

$category = ORM::factory('category', 1);

foreach ($category->blog_posts as $post)
{
    echo $post->title, $post->author->username, $post->body;
}

本文章来源于kohana.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值