0

假设我有一个“users”表,其中包含一个名为“user_type”的字段,为了简单说明,如果 user_type 为“C”,则该用户是诊所的所有者,如果 user_type 为“D”,则该用户是牙医。

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

我的问题是...

  1. 我需要诊所和牙医数据库表吗???

  2. 如果我不需要那两张表,那么我需要多少个模型,只需要一个用户模型或诊所和牙医模型???

  3. 如果我只需要一个用户模型,请提示我如何编写用户模型和相关链接($belongsTo,$hasMany)???

PS Clinic 的所有者和牙医是该系统的用户。

请给我提意见。谢谢。


更多关于系统

该系统适用于作为系统付费客户的诊所所有者。该系统将允许他们宣传牙医和助理的工作机会。

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

每个诊所保存的记录可以被其他诊所看到。

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

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

谢谢

4

1 回答 1

2

我会试着回答这个问题。

“诊所”的单独模型

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

“牙医”和“诊所老板”的单独模型

关于“牙医”和“诊所所有者”的单独数据库表您提到“牙医”和“诊所所有者”都是系统的用户(并且可能都应该能够登录)。此外,“诊所老板”很可能也是“牙医”。

因此,我认为您可以安全地使用“用户类型”来指示一个人是否(也是)诊所所有者。

数据库表的命名

关于数据库表的命名。

尽管牙医和诊所所有者都是系统的“用户”,但您可能会问自己,“用户”是否是描述两者的最佳名称。

如果诊所所有者也是牙医,我建议为您的表格命名'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,应该AssistantsClinicOwners自己的数据库表应该基于他们的使用情况。如果除了它们之外,所有“基本上”都相同,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 部分

于 2013-03-19T08:34:14.373 回答