0

在我的控制器中,我想设置一个变量(A),该变量与另一个模型(B)具有一对多关系,而另一个模型(B)与另一个模型(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”都会包含它各自的Cs?

4

2 回答 2

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);
}

这应该可以满足您的需要,将 recursive 设置为 2 是一种简单的方法,但如果您有其他关联,您将获得冗余数据。

于 2013-04-17T15:30:57.043 回答
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'))));  
于 2013-04-17T15:37:48.910 回答