如何为模型编写关联链接



假设我有一个"users"表,其中有一个名为"user_type"的字段,简单解释一下,如果user_type为"C",则用户是诊所的所有者,如果user_type为"D",则用户是牙医。

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

我的问题是……

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

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

  3. 如果我所需要的只是一个用户模型,请提示我如何编写用户模型和相关链接($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, 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(访问控制列表)来定义每个"用户类型"的确切权限,即用户"角色"。您可能还想为此创建一个'roles'数据库表(以及一个Role模型)

用几行文字完全解释ACL是相当困难的,所以我建议阅读关于这个主题的文档;

访问控制列表

和例子:

简单Acl控制应用

简单Acl控制应用-第2部分

最新更新