我会试着回答这个问题。
“诊所”的单独模型
如果您想在系统中存储有关诊所的信息(例如地址、名称等),那么您应该有一个用于存储该信息的数据库表和一个用于使用该信息的模型。
“牙医”和“诊所老板”的单独模型
关于“牙医”和“诊所所有者”的单独数据库表您提到“牙医”和“诊所所有者”都是系统的用户(并且可能都应该能够登录)。此外,“诊所老板”很可能也是“牙医”。
因此,我认为您可以安全地使用“用户类型”来指示一个人是否(也是)诊所所有者。
数据库表的命名
关于数据库表的命名。
尽管牙医和诊所所有者都是系统的“用户”,但您可能会问自己,“用户”是否是描述两者的最佳名称。
如果诊所所有者也是牙医,我建议为您的表格命名'dentists'
,因为它可以更好地描述“里面”的内容。为您的“用户”表使用不同的名称不是问题。只要您通过userModel
选项在 Auth 组件中指定正确的模型,仍然可以使用该表登录。例如:
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'userModel' => 'Dentist',
// other settings for 'Form' authentication
)
)
)
);
请参阅文档的这一部分:配置身份验证处理程序
数据库表和模型的示例
总结一下你的情况,你的数据库应该是这样的;
CREATE TABLE dentists
(
id int(4) NOT NULL AUTO_INCREMENT,
username varchar(50) NOT NULL,
password char(128) NOT NULL, -- SHA512 hash (128 characters)
user_type char(1) NOT NULL DEFAULT 'D',
name varchar(75),
address varchar(75),
email varchar(75) NOT NULL,
-- etc..
-- primary key for CakePHP
PRIMARY KEY (id),
-- make sure usernames are unique
UNIQUE KEY unique_username (username)
);
CREATE TABLE clinics
(
id int(4) NOT NULL AUTO_INCREMENT,
-- Note: NOT named according to 'CakePHP' conventions
-- as 'owner_id' is probably clearer than 'dentist_id'
owner_id int(4) NOT NULL,
name varchar(75),
address varchar(75),
-- etc..
PRIMARY KEY (id)
);
模型;
class Dentist extends AppModel {
public $hasOne = array(
'Clinic' => array(
'className' => 'Clinic',
/**
* because we're not following CakePHP
* conventions here.
*
* This should be 'dentist_id' according to CakePHP conventions
* but 'owner_id' is probably clearer in this case
*/
'foreignKey' => 'owner_id',
'dependent' => true
),
);
}
class Clinic extends AppModel {
public $belongsTo = array(
'Dentist' => array(
'className' => 'Dentist',
'foreignKey' => 'owner_id',
/**
* Optionally
*/
'conditions' => array('Dentist.user_type' => 'C'),
),
);
}
note
在我的设计中,诊所只能有一个所有者,但牙医可以拥有多个诊所。如果诊所可以有多个所有者,则应使用 HasAndBelongsToMany 关系
“牙医”和“诊所老板”的更多分离
如果需要,您始终可以为“诊所所有者”( )设置另一个模型ClinicOwners
,连接到与“牙医”相同的数据库表,默认条件为(user_type = 'C'
)。如果您需要有关此的更多信息,我将添加一个示例
更新
一些附加提示,基于提供的附加信息。
决定是否Dentists
,应该Assistants
有ClinicOwners
自己的数据库表应该基于他们的使用情况。如果除了它们之外,所有“基本上”都相同,permissions
那么可以将它们存储在同一个数据库表中。
即使它们在同一个数据库表中,也可以(为了方便)创建使用相同数据库表的不同模型,例如:
class Assistants extends AppModel {
public $useTable = 'dentists'; // or 'users' if you decide on that
/**
* This model automatically filters results
* to show only records with user_type 'A' (assistant)
*
* {@inheritdoc}
*
* @param array $queryData
*
* @return mixed
*/
public function beforeFind(array $queryData)
{
if (!empty($queryData['conditions'])) {
$queryData['conditions'] = array(
'AND' => array(
$this->alias . '.user_type' => 'A',
$queryData['conditions'],
)
);
} else {
$queryData['conditions'] = array(
$this->alias . '.user_type' => 'A'
);
}
return $queryData;
}
}
权限
因为权限将基于 user_type,所以值得考虑将“user_type”重命名为“role”(或类似名称)。您可能需要 ACL(访问控制列表)来定义每个“用户类型”的确切权限,即用户“角色”。您可能还想为此创建一个“角色”数据库表(和一个Role
模型)
用几行代码完全解释 ACL 相当困难,所以我建议阅读有关此主题的文档;
访问控制列表
和例子:
简单 Acl 控制的应用程序
简单 Acl 控制的应用程序 - 第 2 部分