首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为模型编写关联链接?

如何为模型编写关联链接?
EN

Stack Overflow用户
提问于 2013-03-18 18:02:32
回答 1查看 58关注 0票数 0

假设我有一个“用户”表,其中有一个名为" user_type“的字段,如果user_type是"C”,这个用户是诊所的所有者,如果user_type是"D“,那么这个用户是牙医。

我希望这个系统中的牙医属于他/她所联系的诊所。

我的问题是..。

  1. 我需要诊所和牙医数据库表吗?
  2. 如果我不需要这两个表,那么我需要多少模型,只是一个用户模型或诊所和牙医模型以及?
  3. 如果我只需要一个用户模型,请提示我如何编写用户模型和关联链接($belongsTo,$hasMany)?

诊所的主人和牙医都是该系统的使用者。

请告诉我。谢谢。

更多关于系统的信息

该系统是为诊所的业主,作为系统的付费客户。该系统将允许他们为牙医和助理的招聘做广告。

牙医和助理员在被诊所的老板雇用后,可以向系统注册,诊所的老板将成为他们的雇主,并记录他们在系统中的工作方式。如果他们离开诊所,也会更新他/她的就业状况。

各诊所保存的记录可供其他诊所查阅。

它实际上就像雇主和雇员的模型,但是由于在线系统,所以我想到了用户模型。

我是否应该像,任何用户都先注册,所以他/她成为系统的用户,然后他们需要填写更多的信息,无论他们是雇主(诊所的所有者)还是雇员(牙医或助理),这些信息保存在独立的表格中,如诊所、牙医、助理,最终在CakePHP中有模型吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 08:34:14

我试着回答这个问题。

“诊所”的单独模式

如果您想在系统中存储有关诊所的信息(例如地址、名称等),那么您应该有一个数据库表来存储该信息,并有一个使用该信息的模型。

“牙医”与“诊所业主”的独立模式

关于“牙科医生”和“诊所所有者”的单独数据库,您提到“牙医”和“诊所所有者”都是系统的用户(而且可能都可以登录)。另外,“诊所老板”也可能是“牙医”。

正因为如此,我认为您可以使用“用户类型”来指示某人是否是诊所的所有者。

数据库表的命名

关于数据库表的命名。

虽然牙科医生和诊所老板都是系统的“用户”,但你可能会问自己,“用户”是否是描述两者的最佳名称。

如果诊所的主人也是牙科医生,我建议把你的桌子命名为'dentists',因为它更好地描述了什么是“在它里面”。为您的“用户”表使用不同的名称并不是问题。只要您通过userModel选项在Auth组件中指定正确的模型,仍然可以使用该表登录。例如:

代码语言:javascript
复制
public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'Dentist',
                // other settings for 'Form' authentication
            )
        )
    )
);

请参阅文档的这一部分:配置身份验证处理程序

数据库示例-表和模型

总结一下你的情况,你的数据库应该是这样的;

代码语言:javascript
复制
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)
);

模型;

代码语言:javascript
复制
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')。如果您需要更多有关这方面的信息,我将添加一个示例

根据提供的附加信息更新一些附加提示。

决定DentistsAssistantsClinicOwners是否应该有自己的数据库表,应该根据它们的使用情况来决定。如果除了它们的permissions之外,它们基本上都是相等的,那么就可以将它们存储在同一个数据库表中。

即使它们位于同一个数据库表中,也可以(为了方便)创建使用相同数据库表的不同模型,例如:

代码语言:javascript
复制
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部分

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15483733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档