2014-03-04 74 views
2

我有一個條件,大多數模型在檢索數據時必須遵守。設置默認模型條件

這種情況將是該用戶登錄該公司的標識。因此,舉例來說,假設公司編號爲1,則所有相關的信息COMPANY_ID 1必須顯示。

如何爲我的模型設置默認條件?

回答

9

檢查這個代碼

class FooModel extends AppModel { 

    protected $_companyId = null; 

    public function setCompanyId($companyId) { 
     // Optional validation of the id here 
     $this->_companyId = $companyId; 
    } 

    public function beforeFind($query) { 
     if (!empty($this->_companyId)) { 
      $query['conditions'][$this->alias . '.company_id'] = $this->_companyId; 
     } 
     return $query; 
    } 
} 

解耦它從型號上,我建議你實現的行爲這兩種方法,並附加在只需要它的模型。

編輯,這裏的行爲:

class CompanyFilterBehavior extends ModelBehavior { 

    protected $_companyId = null; 

    public function setCompanyId(Model $Model, $companyId) { 
     // Optional validation of the id here 
     $this->_companyId = $companyId; 
    } 

    public function beforeFind(Model $Model, $query) { 
     if (!empty($this->_companyId)) { 
      $query['conditions'][$Model->alias . '.company_id'] = $this->_companyId; 
     } 
     return $query; 
    } 
} 

在你的AppController,你可以這樣做:

public function beforeFilter() { 
    if ($this->User->loggedIn() 
     && $this->{$this->modelClass}->Behaviors->loaded('CompanyFilter')) 
    { 
     $this->{$this->modelClass}->setCompanyId($this->Auth->user('company_id')); 
    } 
} 
+0

不錯的辦法,但我會叫'setCompanyId()'內'beforeFilter() ''on'FooController' – Eagle

+0

那麼,你可以做$ this - > {$ this-> modelClass} - > setCompanyId(...);在每個需要它的控制器的beforeFilter中。如果你在AppController中這樣做,你會遇到問題。如果模型實現方法或者我建議加載行爲,則需要將其包裝在檢查中。 – burzum

+0

查看我更新的答案。 – burzum