[Behavior]Bindable - 控制 Model 的關聯

edited 十月 2013 in CakePHP
介紹網址:
http://bakery.cakephp.org/articles/view/bindable-behavior-control-your-model-bindings

如果使用的 Model 是透過 Bake 產生,很有可能所有的關聯都寫在 Model 的定義中,但並不是每次查詢都需要把一拖拉庫的子孫都挖出來,所以 CakePHP 有提供 unbindModel 與 bindModel 等方法,讓人可以動態掛載或卸載 Model 的關聯,只是會陷入一個問題,到底原始定義是該周詳些還是簡略些,前者可能造成需要頻繁的 unbindModel ,後者反之,需要經常 bindModel ,感覺都不是很好。

使用了 Bindable Behavior 後,我在 Model 都會建立完整的關聯定義,接著透過 restrict() 方法來動態定義我所需要的關聯資料,因為比起官方的形式來的方便些,我將它加在 AppModel 中,讓所有 Model 都可以使用。

用了之後自己會經常出現邏輯性的錯誤,因為關聯太多層了 ~^^

另外有個問題, restrict() 方法跟 paginate() 合用時,restrict() 似乎會失效?在討論群組中找到答案:
http://groups.google.com/group/cake-php/browse_thread/thread/f0a333bf448b70fc

只要在 restrict() 的第一個參數設定為 false 即可

另外,我也不確定這對執行效能的影響,只知道很好用...^^||

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3118

評論

  • edited 一月 2008
    很棒的東西阿!!!!

    Kiang 真是厲害,總是會找到很優秀的東西.. :p

    這個作者還有其他的作品..
    像是這個..
    http://cake-syrup.sourceforge.net/ingredients/soft-deletable-behavior/

    softdelete , 只要在 table 加上 deleted , deeted_date

    然後 model 用這樣..
    1. class Article extends AppModel {
    2. var $name = 'Article';
    3. var $actsAs = array('SoftDeletable');
    4. }

    就可以用一般的 delete 實現邏輯刪除的動作...
    1. // Soft delete record 1 & 2
    2. $this->Article->delete(1);
    3. $this->Article->delete(2);
    4. // Let's undelete record 2
    5. $this->Article->undelete(2);
    6. // And now let's purge so soft deleted records are permanently deleted
    7. $this->Article->purge()

    最後的 purge() 則是真的把資料刪掉喔..
  • edited 一月 2008
    官方網站已經提供很豐富的資訊了,我也自顧自的把一些沒有出現在官方網站的資源列在這兒:
    http://groups.google.com/group/cake-php/web/some-solutions-in-the-corner-of-the-world

    :)
  • edited 四月 2008
    同時使用分頁元件(paginate)時可能會遇到一些狀況,因為分頁元件內部會進行兩次查詢(find('count') 與 find('all')),所以如果是這樣子設定:
    $this->MyModel->restrict(array('SubModel' => array('fields' => array('id', 'name'))));
    $this->set('data', $this->paginate($this->MyModel));
    
    會發現資料並沒有照著預期的條件產生,要改成這樣:
    $this->MyModel->restrict(false, array('SubModel' => array('fields' => array('id', 'name'))));
    $this->set('data', $this->paginate($this->MyModel));
    

    第一個參數為 false 的用意是在接下來的查詢中繼續沿用這個條件,這個問題害我把網頁伺服器搞掛了好幾次,特別記錄一下。
  • edited 五月 2008
    在最新版本已經有類似的 Behavior 出現 - Containable

    http://cakebaker.42dh.com/2008/05/18/new-core-behavior-containable/
Sign In or Register to comment.