gettyying
导航
PHP博客
首页
新随笔
联系
聚合
管理
<
2024年4月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
统计
随笔 - 1
文章 - 0
评论 - 0
引用 - 0
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
*nix
(rss)
CakePHP(1)
(rss)
DIV+CSS
(rss)
Essay
(rss)
Javascript + AJAX
(rss)
PDA Palm Treo
(rss)
Perl
(rss)
PHP
(rss)
Python
(rss)
ROR
(rss)
随笔档案
2009年3月 (1)
搜索
最新评论
2009年3月12日
Containable使用方法
声明一下,本文章出自于Just popping in之手..
要知道cake的behaviors是怎么用。cake里的behaviors是拿来扩展model的。
model 里提供了好多回调函数,诸如 beforeSave afterSave beforeDelete.....等等,这些方法,在behaviors里同样适用。只不过,model调用这些回调函数时,默认把当前model实例当 成第一个参数传入。所以behaviors的方法,如果想让外部可用,那么函数名大概为
1. function myFunc(&$model, $参数1, $参数2...) {
2. //doSomeThing
3. }
使用时,载入当前behaviors,然后$model->myFunc($参数1, $参数2...);
载入behaviors,最简单的方法当前就是在Model里加上,如:
1. <?php
2. class AppModel extends Model {
3. var $actsAs = array(
4. 'Containable'
5. );
6. }
7. ?>
忘 了介绍Containable是干什么用的了。经常听到人说,“我Model间使用了很多关联,怎么样才能取到所需的数据,减少不必要的数据库操作 呢?”。Containable就是拿来干这事儿的。当然Model里有recursive属性,但是这个不怎么人性化,虽然有-1 0 1 2等等几级可以设置关联,但是同一级之间,我想取消到不必要的关联,这办法就不管用了。顺便说一句,要想取消掉当前Model所有关 联,recursive应该设置为-1,而不是为0。如果为0的话,当前Model还会关联belongsTo和hasOne的Model。
Model 里还有bindModel和unbindModel方法,但是查出来垃圾数据太多啦……@#&%……¥。想不通的 是,cake为什么不把Containable写到Model内部里去,而非要当成behaviors使用。难道是为了证明behaviors的强大
因为Containable比较实用,所以可以在Model基类,即AppModel就载入这个Behaviors了。
假如
User hasMany Article
User hasOne Profile
User belongsTo Group
User hasAndBelongsToMany Role
Article hasMany Comment
Comment belongsTo User
......
若当前对User Model进行操作。
1、只想取出用户所对应的文章
A $userModel->contain('Article');
B. $data = $userModel->find('all');
2、想取出用户所对应的文章,以及文章所拥有的评论
A. $userModel->contain('Article.Comment');
B. $userModel->contain(array('Article' => 'Comment'));
C. $data = $userModel->find('all');
3、我只想取出用户对应文章的标题
A. $userModel->contain('Article(title)');
B. $data = $userModel->find('all');
4、我想取出用户对应的文章,以及文章对应的评论,以及评论所对应的用户
A. $userModel->contain(array('Article' => array('Comment' => 'User')));
5、我想取出用户对应文章的标题,但是这些文章的条件是is_top=1
A. $userModel->contain(array('Article' => array('fields' => array('title'), 'conditions' => array('is_top' => 1))));
........依此类推吧,大概就这样。
如何在分页里使用呢? 很简单,拿上面的例子来说..
1. $this->paginate = array('User' => array('fields' => array('title'), 'contain' => array('Article(title)')));
有人说,分页时,我也用
1. $userModel->contain('Article');
好像结果不对。那就对了,因为分页时,Model其实find了两次了,一次是find count取总数,一次是取出当页数据。而每次find时,默认reset为true,所以find结束后,都会resetAssociations一 下,重置当前的Model关联。所以换个方法
1. $userModel->contain(false, array('Article'));
第一个参数如果为布尔值的话,那么会当成reset参数传递进去了...
更进一步,使用condition 的方式..
* $post->contain(array(
'User'=>array(
'conditions'=>array(),
'fields' =>array(
'User.username',
'User.email')
'limit'=>...
)));
就跟model::find的参数一样...
posted @
2009-03-12 10:16
Glenda Guo 阅读(118) |
评论 (0)
|
编辑
收藏
仅列出标题