- Moon.Wong
- 评论(0)
随时随地更改模型关联
假设,Author模型中同时有两个关联
1,与Book模型是一对多类型的关联
2,与Profile模型是一对一类型的关联
现在,如果我们要调取所有作者以及作者个人资料,我们会使用如下代码:
$this->Author->recursive = 1;
$authors = $this->Author->find('all');
但 find(‘all’)操作也会返回所有所有相关的图书信息,因为profile和Book模型都是处于递归的第一级别。我们可以忽略所有的Book模型 数据,并且只使用Auhor和Profile的模型数据。但是这样做牺牲了性能。有些时候,我们需要在调用find(‘all’)操作之前摧毁 Author 和Book模型之间的关联,以便得到我们需要的数据。
在这种情况下使用unbindAll()就非常有用了,下面这段代码就向我们展示了如何展示一处Author和Book模型之间的关联。
$this->Author->recursive = 1;
$this->Author->unbindModel(
array(
'hasMany' => array(
'Book' => array(
'className' => 'Book'
)
)
)
);
$authors = $this->Author->find('all');
有时,我们需要临时添加一个关联,。如果我们需要在Author模型和Tuorial模型之间临时添加一个一对多类型的关联,我们可以像下面这样使 用模型方法bindModel()达到这一目的。
$this->Author->bindModel(
array(
'hasMany' => array(
'Tutorial' => array(
'className' => 'Tutorial'
)
)
)
使用bindModel()和UnbindModel()方法创建和销毁模型间的关联,只对随后的模型操作有效,除非这两个方法的第二个参数设置为 真。如果第二个参数设置为真,那么设置的模型关联就会在余下的模型操作中继续生效。
小结
这一章节的所有内容都是关于模型关系以及模型关联的。我们学习了如何为模型间不同的关系定义对应类型的关联,我们首先了解了一对一和一对多类型的这 类简单关系,接着如何见识了如何使用 $hasOne, $hasmany, 和$belongsTo 模型属性来定义关联。接着我们了解了这些关联是如何让保存和调取相关模型的数据变得非常简单。我们也学习了如何使用关联数组来自定义模型关联时的相关参数
随后,我们研究了多对多的关系——这是一种更复杂的数据库关系。我们了解了如何将模型属性 $hasAndBelongsToMany添加到多对多关系的相关模型中,以表示这种特殊类型的关系。我们接着见识了如何使用Cake轻松处理这种复杂类 型的关系的,以及在关联定义好后如何轻松调取和存储相关模型数据。
我们也了解到一旦这种关联定义好后,删除相关模型中的数据就不用吹灰之力了。Cake会非常智能地处理删除操作,对于简单的关系,你可能需要对模型 的关联属性做一些小修改,我们也学习了如何随时随地的更改该关联,以及了解到如何使用bindModel()和UnbindModel()方法来达到这一 目的。
如果你已经完成这一章节,你可以自封为Cake的关联问题高手,老实说,你的确可以这样夸口了,你已经掌握了Cake的关联功能,但是别太自满,请 继续阅读本书的其他章节,我们还有其他CakePHP内容要学。下面我们将要学习的就是视图——视图文件包含有数据显示的逻辑代码。(本章节完)