CakePHP:如何设置具有多个级别依赖项的变量

时间:2013-04-17 15:24:20

标签: php cakephp cakephp-2.0

在我的控制器中,我想设置一个与另一个模型(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?

2 个答案:

答案 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'))));