2011-03-19 24 views
1

在我的「Reports」控制器中,它只是一個沒有任何實際數據庫的虛擬控制器,我試圖生成其他模型的分頁視圖。例如,爲了產生「交易」模式的分頁視圖我做了以下內容:在使用loadModel時遞歸分頁

$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)) 

我得到關聯的數據,但沒有分頁。我將如何獲得包含關聯數據的分頁視圖?

回答

2

有兩件事情:首先,即使多個模型名稱可以出於某種奇怪的原因而工作,約定是模型名稱是單數的,如$this->loadModel('Transaction');。見the manual on naming conventions

其次,忘記recursive並去爲Containable行爲。坦率地說,我很好奇它爲什麼不是默認的過程(可能是因爲Containable在框架非常成熟時被創建)。馬特有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, 
    ) 
); 

執行相同的會員模式。這裏 (該$actsAs變量中的AppModel類告訴所有型號使用中可容納)

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

3)在報告控制器,更改代碼:

2)使用此代碼創建一個app_model.php文件/app/如下所示: (包含參數是要包含的所有關聯模型的數組,只能包含一個關聯模型或全部或任何您想要的)。

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

就是這樣!

+0

聖sh **。這樣一個簡單的錯誤!我已經使用了兩年的Cake,並且我無法發現我使用的是複數而不是單數的名稱!我昨天爲什麼沒有工作而頭痛。 @YOMorales,謝謝你的時間。你真的有一個尖銳的眼睛:)而且我知道Containable,我也試過這之前張貼在這裏。我同意你所說的話,那可以包容的是更好的做法。我在使用蛋糕之前就已經打好了v1,很久之前它就變得容易了,我猜舊的習慣會很難:D – Ashok 2011-03-19 06:35:14

+0

很酷!從那時起我一直在使用Cake!與長期使用者交談是件好事。無論如何,奇怪的是,複數模型名稱DO可以用於您提供的示例代碼。很奇怪,是的。 – YOMorales 2011-03-19 06:40:18

+0

馬特的所有鏈接似乎最近都被打破。有人知道該電子書的工作鏈接嗎? – 2011-03-21 20:52:27