- 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"关联中,无法使用,因为只有一条相关记录。