假设我有一个“用户”表,其中有一个名为" user_type“的字段,如果user_type是"C”,这个用户是诊所的所有者,如果user_type是"D“,那么这个用户是牙医。
我希望这个系统中的牙医属于他/她所联系的诊所。
我的问题是..。
诊所的主人和牙医都是该系统的使用者。
请告诉我。谢谢。
更多关于系统的信息
该系统是为诊所的业主,作为系统的付费客户。该系统将允许他们为牙医和助理的招聘做广告。
牙医和助理员在被诊所的老板雇用后,可以向系统注册,诊所的老板将成为他们的雇主,并记录他们在系统中的工作方式。如果他们离开诊所,也会更新他/她的就业状况。
各诊所保存的记录可供其他诊所查阅。
它实际上就像雇主和雇员的模型,但是由于在线系统,所以我想到了用户模型。
我是否应该像,任何用户都先注册,所以他/她成为系统的用户,然后他们需要填写更多的信息,无论他们是雇主(诊所的所有者)还是雇员(牙医或助理),这些信息保存在独立的表格中,如诊所、牙医、助理,最终在CakePHP中有模型吗?
谢谢
发布于 2013-03-19 08:34:14
我试着回答这个问题。
“诊所”的单独模式
如果您想在系统中存储有关诊所的信息(例如地址、名称等),那么您应该有一个数据库表来存储该信息,并有一个使用该信息的模型。
“牙医”与“诊所业主”的独立模式
关于“牙科医生”和“诊所所有者”的单独数据库,您提到“牙医”和“诊所所有者”都是系统的用户(而且可能都可以登录)。另外,“诊所老板”也可能是“牙医”。
正因为如此,我认为您可以使用“用户类型”来指示某人是否是诊所的所有者。
数据库表的命名
关于数据库表的命名。
虽然牙科医生和诊所老板都是系统的“用户”,但你可能会问自己,“用户”是否是描述两者的最佳名称。
如果诊所的主人也是牙科医生,我建议把你的桌子命名为'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'),
),
);
}注意到在我的设计中,一个诊所只能有一个主人,但是一个牙医可以拥有多个诊所。如果诊所可以有多个所有者,则应该使用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‘重命名为’user_type‘(或类似的)。您可能需要ACL (访问控制列表)来定义每个“用户类型”的确切权限,即用户的角色。您可能也希望为此创建一个“角色”数据库表(以及一个Role模型)。
充分解释ACL是相当困难的几行,所以我建议阅读有关这一主题的文件;
访问控制列表
并举例说明:
简易Acl控制应用
简易Acl控制应用.第2部分
https://stackoverflow.com/questions/15483733
复制相似问题