首頁  >  文章  >  後端開發  >  Cakephp如何在paginate使用unbind

Cakephp如何在paginate使用unbind

黄舟
黄舟原創
2016-12-20 10:03:551592瀏覽

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將會是


array(

   

但如果運行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');


另外,如果在運行paginate()後,還需要使用model裡的關聯資料來find 資料.可以在app_model.php檔案裡增加以下程式碼




  /**
     * 函數說明:關閉關聯,並傳回關聯。
   *                      且此函數適用於 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)!



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn