使用loadModel时递归递归

时间:2011-03-19 01:59:56

标签: cakephp cakephp-1.3

在我的“Reports”控制器中,它只是一个没有任何实际数据库的虚拟控制器,我正在尝试生成其他模型的分页视图。例如,要生成“事务”模型的分页视图,我正在执行以下操作:

$this->loadModel('Transactions');
$this->Transactions->bindModel(array('belongsTo'=>array('Item'=>array('className'=>'Item'),'Member'=>array('className'=>'Member'))));
$results = $this->paginate('Transactions',null,array('recursive'=>1));

但这并没有从项目和会员那里获得相关数据。如果我做了

$this->Transactions->find('all',array('recursive'=>1))

我获取了相关数据,但没有分页。我如何获得包含相关数据的分页视图?

1 个答案:

答案 0 :(得分:2)

两件事:首先,即使多个模型名称可以用于某些奇怪的原因,但惯例是模型名称是单数的,如$this->loadModel('Transaction');。请参阅the manual on naming conventions

其次,忘记recursive并继续Containable行为。坦率地说,它非常有用,我想知道它为什么不是默认进程(也许是因为在框架非常成熟时可以创建Containable)。 Matt已经a good book解释了为什么Containable是好的(下载它,真的,它几乎是强制性的:D)。但是为了提供更多帮助,我将告诉您如何解决您的问题:

1)定义模型中的关联,例如:

在交易模型中:

var $belongsTo = array(
    'Item' => array(
        'className' => 'Item',
        'foreignKey' => 'item_id',
    )
);

在物品模型中:

var $hasMany = array(
    'Transaction' => array(
        'className' => 'Transaction',
        'foreignKey' => 'item_id',
        'dependent' => true,
        'exclusive' => true,
    )
);

对会员模型执行相同的操作。

2)使用以下代码在app_model.php中创建/app/文件: (AppModel类中的$actsAs变量告诉所有模型使用Containable)

<?php
class AppModel extends Model {
    var $recursive = -1;
    var $actsAs = array('Containable');
}
?>

3)在Reports Controller中,将代码更改为以下内容: (contains参数是您要包含的所有关联模型的数组。您只能包含一个关联模型,或全部,或任何您想要的任何模型。

$this->loadModel('Transaction');
$this->paginate = array('Transaction' => array('contain' => array('Item', 'Member')));      
$results = $this->paginate('Transaction');

就是这样!