cakephp的controller中的paginate是一個得到分頁資料的函數.配合helper裡的Paginator,可以很輕鬆的做出分頁列表,排序的列表頁面.
但由我開始學習用cakephp時,我就有一個問題一直困擾著我.
Model如何解除關聯(unbind)?
正常的情況下,只要在find之前解除(unbind)我不需的model.就可以不去搜索這些modeld關聯的數據表.而且在find完我之後會自動回撥前解除的model再次關聯起來.以下是常用的使用方法
//user model
class User extends AppModel {
var $name = 'User var $
'Profile' = array('className'=>'Profile','foreignKey'=>'user_id')
$this->User->unbind(array ('belongsTo'=>array('Profile')));
$rs=$this->User->find();
$rs會是
array(
$rs會是
array(),
)
如果在find之前沒有運行unbind,$rs將會是
但如果運行paginate就得不到同樣的結果
code]
$this->User->unbind(array('belongsTo'=>array('Profile')));
$rs=$this ->paginate('User');
[/code]
$rs的結果還是
array(
'User'=>array(
為什麼在paginate不能解除關聯(unbind)?
原因是在find裡在得到數據後,find會用model->resetAssociations();把所有關聯(Association)還原.而paginate裡使用了兩次find.一次是得到總數,另一次得到分頁顯示的數據.所以返回的結果還是有Profile的內容.
解決方法:給unbind的第二個參數裡賦上非ture的值.如果unbind的第二個參數是true ,cakephp會把需要解除關聯的資料庫保存到model->__backAssociation裡,當運行model->resetAssociations();會從model->__backAssociation把相關的關聯的數據還原.所以以下程式碼就可以解決
$this->User->unbind(array('belongsTo'=>array('Profile')),false);
$rs=$this->paginate('User');
/**
* 函數說明:關閉關聯,並傳回關聯。
* 且此函數適用於 Controller->paginate() 與 Model->bind()。
* 此函數將協助您取得資料表單Controller->paginate 關聯並在取得資料後重新綁定移除關聯。
* 如果不需要重新綁定關聯,則只能使用
*
* $這個->模型->unbind($params,false);
*
* @Date:2008-10 -10
* <br> * $backAssociation = $this->ModelName- >unbindAndPushModels(array('belongsTo'=>array('User')));<br> * $result=$$s> ');<br> * $this->ModelName->bind ($backAssociation);//這個動作是恢復關聯資料的模型。 <br> *
* @param (類型)參數名稱 : 說明
**/
Function unbindAndPushModels($params)
{
{
foreach ($models as $model )
{
If(isset($this->{$assoc}[$model]))
;
unset ($this->{$assoc}[$ model]);
}
}
}
cn)!