在我的“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))
我获取了相关数据,但没有分页。我如何获得包含相关数据的分页视图?
答案 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');
就是这样!