2013-09-23 86 views
1

我有一個用戶模型,用於存儲牙科檢查系統用戶的數據。Cakephp - 一個表的多個模型

通常情況下,會存在三類用戶:Admininistrator位置管理考官

在我的應用程序中將這三個角色當作獨立模型似乎已經成爲必要(想象一下,如果我對不同選項的每個角色有不同的看法......這是一場噩夢)。

我該如何去設置每個模型中的關係。

我首先想到的是:

//Administrator Model 
class Administrator extends User { 
    $name = 'Administrator'; 
    $table = 'User'; 
    $belongsTo = array(
     'User' => array(
      'className' => 'User', 
      'conditions' => array('User.role' => 'administrator'), 
     ) 
    ); 
} 

然後用戶模型將引用這個使用的hasMany?就CakePHP慣例而言,如何準確地對此進行建模?

此外,該模型是否會擴展用戶模型或AppModel?

+0

爲什麼? 難道你不能僅僅根據角色爲每個用戶添加一個包含相關數據的「選項」模型嗎? – yossi

+0

我同意爲每個用戶類型設置完全不同的模型可能不是最好的設計。但我不知道有足夠的細節可以確定。至於你的問題 - 用戶模型應該只有管理員,位置管理員或審查員之一,所以有一個應該是關係。最有可能你只是想其他車型,管理員等,以擴展AppModel,而不是用戶。 – Kai

回答

2

當然,您可以使用相同的表名創建不同的模型。要做到這一點,鏈接與特定的表中的每個模型$ useTable財產(不$表):

class Administrator extends AppModel { 
    public $useTable = 'User'; 
} 

但我不知道任何CakePHP的模型屬性,這將允許您篩選數據獲取結果時返回..你可以用另一個鏈接模型時,例如只寫你自己的條件:

class SomeOtherModel extends AppModel { 
    public $hasMany = array(
     'Administrator' => array(
      'className' => 'Administrator', 
      'conditions' => array('Administrator.role' => 'administrator') 
     ) 
    ); 
} 

這是不是一個很好的解決方案,因爲它會爲SomeOtherModel模型執行查詢時纔會工作。

您也可以嘗試將一個一個afterFind()回調到您的管理員/考官/ ...車型將刪除其他角色比需要的用戶,但當然這不是一個有效的解決方案。

另一種解決方案是隻創建其中將包含所選角色的唯一用戶(更多觀點 - here)不同的數據庫視圖。然後,您可以將每個視圖指向您的CakePHP模型,就像它是一個普通的數據庫表一樣。 但是這個解決方案也不完美。如果將來必須添加新的用戶角色或更改表格模式,則還必須修改數據庫視圖。