关系

Kohana 的 ORM 支持四种类型的对象关系:belongs_tohas_manyhas_many "through"has_one。可以像这样使用 ‘has_many “through”’ 的对象关系的功能,如 Active Record 的 has_many_and_belongs_to 关系类型。

belongs_to

如果有 一个 属于 另一个 模型时,应使用一个 belongs_to 关系。 例如 ,一个 模型 Child 是 模型 Parent 的成员 或者 模型 Flag 属于 模型 Country

这是基于 belongs_to 的关系:

  1. protected $_belongs_to = array(
  2. '[alias name]' => array(
  3. 'model' => '[model name]'
  4. 'foreign_key' => '[column]'
  5. ),
  6. );

您可以省略所有在右边数组中的 key/value,在这种情况下使用默认值:

  1. protected $_belongs_to = array('[alias name]' => array());

别名 是用于访问代码中的相关模型。 如果您有一个 Post 模型,属于一个 User 模型,并希望使用 belongs_to 配置的默认值,那么您的代码应该像这样 :

  1. protected $_belongs_to = array('user' => array());

要访问 post 的 user 模型,可以使用 $post->user。 由于我们以上使用的默认,那么表明就是 模型名字,并且 post 表的外键就是 别名 后缀以 _id,在当前情况下就是 user_id。 (您可以在模型中通过修改 $foreign_key_suffix 模型属性 来改变 _id 这个后缀。)

比方说, 您的 Post 数据库表的架构没有 user_id 列,而是具有 author_id 这样一个外键,存在于 数据表 User 的列。 您应该使用这样的代码:

  1. protected $_belongs_to = array(
  2. 'user' => array(
  3. 'foreign_key' => 'author_id'
  4. ),
  5. );

如果想通过 $post->author 这样的代码访问一个 post 的 author ,那么你只需要简单的修改 author 的值 中 model 的模型别名:

  1. protected $_belongs_to = array(
  2. 'author' => array(
  3. 'model' => 'user'
  4. ),
  5. );

has_many

标准的 has_many 就好像是从 belongs_to 关系的另一边来看。 在上面的例子中,一个 post 只隶属于一个 author 。 而从 author 角度来看,一个 author 可以有多个 post。 一个 has_many 关系可以这样定义:

  1. protected $_has_many = array(
  2. '[alias name]' => array(
  3. 'model' => '[model name]'
  4. 'foreign_key' => '[column]'
  5. ),
  6. );

同样,你可以省略,右边的数组所有键,使用默认:

  1. protected $_has_many = array('[alias name]' => array());

对于我们的 author 和 post 的例子,在 user 模型类似于以下:

  1. protected $_has_many = array('posts' => array());

承接上面的例子,可以通过 [ORM::find_all] 来获得该 author 的所有的 post 。 注意在这个例子中使用的是 [ORM::find_all] 。 belongs_tohas_one 关系类型, 该模型已经加载了必要的数据。 使用像 has_many 这样的关系,你可能有要限制结果的数量的需求,或者还有其他的搜索条件,这样的话您可以将这些条件添加到 [ORM::find_all] 之前 。

The model name used by default will be the singular name of the alias using the inflector class。 这个情况下,posts 使用 post 作为模型的名字。 外键的如果缺省的话,默认值为 外键隶属的模型名字后缀以 _id 构成。 那么,外键就是 user_id 并且 前提是在 posts 表中必须存在这样的一个列。

我们假设你先想用 别名 stories 来代替 posts ,并且依旧使用 belongs_to 例子中的 author_id 。 您就可以这样定义您的 has_many 关系:

  1. protected $_has_many = array(
  2. 'stories' => array(
  3. 'model' => 'post'
  4. 'foreign_key' => 'author_id'
  5. ),
  6. );

has_one

has_one 关系 和 has_many 关系 有相似之处。 has_one 是两个模型间 有且只有一个的从属关系 (而 `has_many 是 有一个 或者 多个 从属的关系 )。 如果 user 只对应一个 post 或者 story,而不是一对多的关系 那么代码可以这样设计:

  1. protected $_has_one = array(
  2. 'story' => array(
  3. 'model' => 'post'
  4. 'foreign_key' => 'author_id'
  5. ),
  6. );

has_many “through”

has_many "through" 关系可来描述 多对多 的模型间关系。 例如,让我们假设,现在我们有了一个额外的模型,称为 Category。 post 可能属于多个 category,每个 category 可能有多个 post 。 它们连接起来,需要表中有一个额外的列,post_idcategory_id (有时被称为数据透视表)。 我们将其模型命名为 Post_Category 相应的表是 categories_posts

要定义 has_many "through" 这样的关系,那么想通的语法是在 has_many 关系的标准语法上增加 ‘through’ 这样一个参数。 我们假设我们是这样使用的 Post 模型:

  1. protected $_has_many = array(
  2. 'categories' => array(
  3. 'model' => 'category'
  4. 'through' => 'categories_posts'
  5. ),
  6. );

在 Category 的 模型中:

  1. protected $_has_many = array(
  2. 'posts' => array(
  3. 'model' => 'post'
  4. 'through' => 'categories_posts'
  5. ),
  6. );

若要访问 categories 和 posts,可以这样简单的使用 $post->categories->find_all()$category->posts->find_all()

多对多关系的关系 有方法可以 进行 检查,添加 和 删除。 假设我们已经有了一个加载过的 $post 模型,还有一个一样加载过的 $category 模型。 您就可以调用下面的代码来检查 $post 模型 是否和 $category 模型 有关系:

  1. $post->has('categories'$category);

第一个参数是用来检查的模型的别名 ( 在这个情况下 您的 post 模型有一个以上的 category 模型的关系 ) 第二个就是用来检查关系的模型。

假设你要添加关系 (在categories_posts表中创建一个新的记录),可以简单的使用下面的代码:

  1. $post->add('categories'$category);

下面的是删除:

  1. $post->remove('categories'$category);