0fees CakePHP应用开发 第六章 对象关系映射:构建表关系 (6)
— 文章所属小组: CakePHP
CakePHP应用开发 第六章 对象关系映射:构建表关系 (6)
  • Moon.Wong
  • 评论(0)

一对一关系

定义一对一关系的关联与定义一对多关系的关联非常类似。接下来让我们看一个例子,了解如何在模型中定义一对一关系。首先假定我们有一个 profiles表,并且profile表与author表之间的关系是一对一。为了确立这种关系,我们新建了一个带有author_id外键的 profile表。

现在,在两个模型类Author和Profile中,我们需要为这种关系定义关联。在带有外键的表所对应模型中,我们需 要定义belongsTo关联,因此在Profile表中,我们需要定义belongsTo关联。另一方面,一个作者只能有一个关联的个人资料 ——为了在Author模型中定义这种关联,我们可以使用hasOne类型的关联

类似地,在Author模型中,我们需要定义一个$hasOne属性

var $hasOne = array(
      'Profile' => array(
      'className'  => 'Profile',
       )
    );

另外,我们在Profile模型中也需要定义一个$belongsTo模型:

var $belongsTo = array(
      'Profile' => array(
      'className'  => 'Author',
       )
    );

在”一对一“和”一对多“关系中,对应基础表有外键的模型使用belongsTo关联。这两种关系之间的唯一却别就是:在另一个模型中,一个是使用 hasOne关联,另一个是使用hasMany类型的关联。


自定义关联的相关特性

使用数组定义关联有另外一个好处——我们可以在关联数组中包含一些键值对关系做更多定义。Authors和books之间自定义的hasMany关 联的形式如下:

var $hasMany = array(
        'Book' => array(
            'className'     => 'Book',
            'foreignKey'    => 'author_id',
            'conditions'    => 'Book.status = 1',
         'fields'        => array('isbn', 'title'),
            'order'        => 'Book.released DESC',
         )
    );

接下来让我们看看如何使用这些键值对来操作关系。

  • className(类名):关联模型的名称
  • foreignKey(外键):该关系中所涉及的外键的名称,就belongsTo来说,它是指当前模型中外键名称。在hasOne或者 hasMany关联中,它是指其他模型对应表中所含外键的名称,它的默认值是目标模型的单数形式加上_id后缀(在 belongsTo,目标模型是指当前模型,而对 hasOne/hasMany,目标模型是指其他模型)
  • conditions(条件),它相当于SQL中的WHERE子句,用来过滤相关模型中的记录。如要调取所有status=1的相关图书,我们需 要把conditions设为”Book.status = 1“
  • fields(字段):它定义了当关联模型数据被调取时,应该检索字段范围。如果没有设置,它会返回所有字段的数据
  • order(排序): 相当于SQL语句中的ORDER BY子句,用来定义返回相关记录的排序方向,在”hasOne“和"belongsTo"关联中,无法使用,因为只有一条相关记录。
填写登录信息
用户名
密码