在我的控制器中,我想设置一个与另一个模型(B)有一对多关系的变量(A),它与另一个模型(C)有一个HABTM(拥有并且属于很多)。
目前,当我在控制器中设置变量时,我可以访问视图中的模型(B),但不能访问ITS依赖项(模型C):
//A's controller...
public function admin_view($id = NULL) {
$A = $this->A->findById($id);
$this->set('A', $A);
}
如果我在视图中转储变量,这就是我所看到的:
//A's admin_view.ctp...
//debug($A);
array(
'A' => array(
'id' => '1',
'name' => 'Name',
'created' => '2013-04-04 15:25:54',
'modified' => '2013-04-04 15:25:54'
),
'B' => array(
(int) 0 => array(
'id' => '1',
'created' => '0000-00-00 00:00:00',
'modified' => '2013-04-05 10:31:42'
),
(int) 1 => array(
'id' => '13',
'created' => '0000-00-00 00:00:00',
'modified' => '2013-04-05 10:31:42'
有没有办法设置变量,这样每个“B”都会包含它各自的C?
答案 0 :(得分:1)
http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html
// In your model
var $actsAs = array('Containable');
// In your controller
public function admin_view($id = NULL) {
$this->A->contain(array('B' => array('C')));
$A = $this->A->findById($id);
$this->set('A', $A);
}
这应该可以满足您的需求,将递归设置为2是最简单的方法,但如果您有其他关联,您将获得冗余数据。
答案 1 :(得分:1)
那么,解释$ recursive和Containable行为:
Recursive是一个介于-1到2之间的值,基本上它告诉模型“我想获取此记录以及与之关联的所有记录”,如果它设置为2.如果它是-1,那么使用find或read你只能得到那个模型数据。
Containable让我们指定您想要获取的其他模型的模型/字段(但它们必须具有关联)。
我已多次重复我不是$recursive != -1
的粉丝,因为我觉得它不会让你控制你检索的数据以及何时执行。我建议你使用
class AppModel extends Model {
public $actsAs = array('Containable');
public $recursive = -1;
//etc
}
在AppMdel中所以默认情况下一切都不是递归的和可包含的(但查询不一定有效)。然后,关于您的问题,查找查询应该像
$A = $this->A->find('first', array('conditions'=>array('id'=>$id),
'contain'=>array('B-model'=>array('C-model'))));