cakephp笔记——在运行期间创建和销毁关联

cakephp进行查找时,如果不对表与表之间的关联进行限制,经常会返回‘一大坨’东西,从而使得返回的数据变得复杂和冗余,所以有时候需要在运行时建立和销毁模型关联。比如以下几种情况:你想减少获取的关联数据的量,但是你的所有关联都是循环的第一级,或者你想要改变定义关联的方法以便排序或者过滤关联数据。因为如果数据表间存在很多关联的话,查询后所返回的值会将所关联的一并返回回来。因此可以使用bindModel()和unbindModel()方法来实现在运行期间创建和销毁关联。

使用例如$this->Leader->unbindModel(array('hasMany' => array('Follower'));即能够将表Leader和表Follower间的关系销毁,从而进行Leader查询的时候不会连带一起查询出后者的数据,但是这种关联的销毁以及创建都是一次性的,只要操作过了一次之后依然恢复到原来的关系。

bindModel() 的基本用法是封装在以你尝试建立的关联类型命名的数组中的常规数组:

1$this->Model->bindModel(
2     array('associationName' => array(
3             'associatedModelClassName' => array(
4                 // normal association keys go here...
5             )
6         )
7     )
8 );

连接表

可以允许你进行跨越多张表的较为复杂的查询,在表间强制添加 join 时,你需要在调用 Model::find() 时使用 “modern” 语法,在 $options 数组中添加 ‘joins’ 键。例如:

 1 $options['joins'] = array(
 2     array('table' => 'channels',
 3         'alias' => 'Channel',
 4         'type' => 'LEFT',
 5         'conditions' => array(
 6             'Channel.id = Item.channel_id',
 7         )
 8     )
 9 );
10 
11 $Item->find('all', $options);

注意 ‘join’ 数组不是一个键。在上面的例子中, Item 的模型 left join 到 channels 表。你可以用模型名为表起别名,以使检索到的数组完全符合 CakePHP 的数据结构。

定义 join 所用的键如下:

  • table: 要连接的表。
  • alias: 表的别名。最好使用关联模型名。
  • type: 连接类型: inner, left 或者 right。
  • conditions: 执行 join 的条件。

你可能感兴趣的:(数据结构,cakephp,bindModel)