Cakephp 如何为模型编写关联链接?
假设我有一个“users”表,表中有一个名为“user\u type”的字段,如果user\u type是“C”,那么这个用户就是诊所的所有者,如果user\u type是“D”,那么这个用户就是牙医 我希望该系统中的牙医属于他/她关联的诊所 我的问题是Cakephp 如何为模型编写关联链接?,cakephp,cakephp-2.1,cakephp-model,Cakephp,Cakephp 2.1,Cakephp Model,假设我有一个“users”表,表中有一个名为“user\u type”的字段,如果user\u type是“C”,那么这个用户就是诊所的所有者,如果user\u type是“D”,那么这个用户就是牙医 我希望该系统中的牙医属于他/她关联的诊所 我的问题是 我需要诊所和牙医数据库表吗 如果我不需要这两个表,那么我需要多少个模型,只是一个用户模型或诊所和牙医模型 如果我只需要一个用户模型,请提示我如何编写用户模型和相关链接($belongsTo,$hasMany) p.S.诊所的所有者和牙医是该系统
更多关于系统的信息 该系统旨在将诊所业主作为系统的付费客户。该系统将允许他们刊登招聘牙医和助理的广告 牙医和助手在被诊所老板雇用后可以在系统中注册,诊所老板将成为他们的雇主,并记录他们在系统中的工作方式。如果他们离开诊所,也会更新他/她的就业状态 每个诊所保存的记录可供其他诊所查看 它实际上就像雇主和雇员模型,但因为在线系统,所以我想到了用户模型 如果我决定使用系统,比如,任何用户只需先注册,就可以成为系统的用户,然后他们需要填写更多信息,无论他们是雇主(诊所所有者)还是员工(牙医或助理),这些信息保存在单独的表中,如诊所、牙医、助理、,最后还有CakePHP中的模型
谢谢我会尽力回答这个问题 “诊所”的单独模式 如果要在系统中存储有关诊所的信息(例如地址、姓名等),则应具有存储该信息的数据库表和使用该信息的模型 “牙医”和“诊所业主”的单独模式 关于“牙医”和“诊所所有者”的单独数据库表 您提到“牙医”和“诊所所有者”都是系统的用户(并且可能都可以登录)。此外,“诊所老板”也可能是“牙医” 因此,我认为您可以使用“用户类型”来指示某人是否(也是)诊所所有者 数据库表的命名 关于数据库表的命名 尽管牙医和诊所老板都是系统的“用户”,但您可能会问自己,“用户”是否是描述两者的最佳名称 如果诊所老板也是牙医,我建议将您的表格命名为“牙医”,因为它更好地描述了“其中”的内容。为“用户”表使用不同的名称不是问题。只要通过
userModel
选项在Auth组件中指定正确的模型,就仍然可以使用该表登录。例如:
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'userModel' => 'Dentist',
// other settings for 'Form' authentication
)
)
)
);
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;
}
}
请参阅本部分文档:
数据库表和模型示例
为了总结您的情况,您的数据库应该如下所示:
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'),
),
);
}
注意
在我的设计中,诊所只能有一个所有者,但牙医可以拥有多个诊所。如果是诊所
可以有多个所有者,应使用HasandBelongTomany关系
进一步分离“牙医”和“诊所业主”
如果需要,您始终可以为“诊所所有者”(ClinicOwners)(ClinicOwners
)设置另一个模型,该模型连接到
与“Destinsts”相同的数据库表,默认条件为(user\u type='C'
)。如果您需要关于这方面的更多信息,我将添加一个示例
更新
根据提供的附加信息,提供一些附加提示
应根据其使用情况决定牙医
、助手
和临床医生
是否应拥有自己的数据库表。如果除了它们的权限
之外,它们“基本”相等,则可以将它们存储在同一个数据库表中
即使它们位于同一数据库表中,也可以(为方便起见)创建使用同一数据库表的不同模型,例如:
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'userModel' => 'Dentist',
// other settings for 'Form' authentication
)
)
)
);
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;
}
}
权限
由于权限将基于用户类型,因此值得考虑将“用户类型”重命名为“角色”(或类似名称)。您可能需要ACL(访问控制列表)来
定义每个“用户类型”(即用户角色)的确切权限。您可能还需要为此创建一个“角色”数据库表(以及一个Role
model)
在几行文字中完全解释ACL是相当困难的,所以我建议阅读关于这个主题的文档
举例如下:
您读过手册中的本章吗?到目前为止你尝试了什么?我已经读完了这篇文章,但我的问题似乎是。。。1.我需要诊所和牙医表吗???2.如果我不需要这些表,如何根据CakePHP概念编写用户模型???请帮我回答第一个问题。非常感谢你的建议,但由于我英语不好,我可能需要一些时间才能理解你写的所有内容。也因为我解释得不好,你对系统有点误解。我将编辑我的帖子来解释更多关于这个系统的信息。我已经添加了一些额外的信息。但是,我不认为我能够完全回答您的问题,因为这需要为您设计几乎整个应用程序。我想我已经给了你很多信息,可以帮助你进行设计,但是设计这样的应用程序需要时间。这将意味着“创建”应用程序,测试它是否能按您想要的方式工作,如果不能,则“返回绘图板”。我