假设我有一个"users"表,其中有一个名为"user_type"的字段,简单解释一下,如果user_type为"C",则用户是诊所的所有者,如果user_type为"D",则用户是牙医。
我希望这个系统中的牙医属于他/她联系的诊所。
我的问题是……
-
我需要诊所和牙医数据库表吗??
-
如果我不需要这两个表,那么我需要多少模型,只是一个用户模型或诊所和牙医模型??
-
如果我所需要的只是一个用户模型,请提示我如何编写用户模型和相关链接($belongsTo, $hasMany)??
注:诊所的老板和牙医都是该系统的用户。
请告诉我。谢谢。
关于系统的更多信息
本系统是为诊所业主作为系统的付费客户而设计的。该系统将允许他们发布牙医和助理的招聘广告。
牙医和助理在被诊所老板雇佣后,可以在系统中注册自己,诊所老板将成为他们的雇主,并在系统中记录他们的工作方式。如果他们退出诊所也更新他/她的就业状态。
每个诊所保留的记录可以被其他诊所看到。
它实际上是雇主和雇员的模型,但由于在线系统,所以我想到了用户模型。
我是否应该决定系统,任何用户只要先注册,这样他/她就成为系统的用户,之后他们需要填写更多的信息,无论他们是雇主(诊所/老板)还是雇员(牙医或助理),这些信息都保存在诊所,牙医,助理等单独的表中,最后在CakePHP中有模型???
谢谢
我来回答这个问题。
"诊所"分离模型
如果你想在系统中存储关于诊所的信息(例如地址、名称等),那么你应该有一个数据库表来存储这些信息,并有一个模型来使用这些信息。
"牙医"one_answers"诊所老板"的分离模型
关于"牙医"one_answers"诊所老板"的单独数据库表你提到"牙医"one_answers"诊所老板"都是系统的用户(应该都能够登录)。此外,"诊所老板"也可能是"牙医"。
因此,我认为使用"用户类型"来表示一个人是否(也是)诊所所有者是安全的。
数据库表命名
关于数据库表的命名。
虽然牙医和诊所老板都是系统的"用户",但你可能会问自己"用户"是否是描述两者的最佳名称。
如果诊所所有者也是牙医,我建议将您的表命名为'dentists'
,因为它更好地描述了"其中"的内容。为"users"表使用不同的名称是不是问题。只要通过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关系
"牙医"one_answers"诊所老板"进一步分离
如果需要,您总是可以设置另一个模型为"诊所业主"(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(访问控制列表)来定义每个"用户类型"的确切权限,即用户"角色"。您可能还想为此创建一个'roles'数据库表(以及一个Role
模型)
用几行文字完全解释ACL是相当困难的,所以我建议阅读关于这个主题的文档;
访问控制列表
和例子:
简单Acl控制应用
简单Acl控制应用-第2部分