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

时间:2013-03-18 18:02:32

标签: cakephp cakephp-2.1 cakephp-appmodel

我们说我有一个"用户"如果user_type为" C"如果user_type是" D"该用户是诊所的所有者。这位用户是牙医。

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

我的问题是......

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

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

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

  4. P.S。诊所的所有者和牙医是该系统的用户。

    请告诉我。 谢谢。


    有关系统的更多信息

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

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

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

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

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

    由于

1 个答案:

答案 0 :(得分:2)

我会尝试回答这个问题。

'诊所'的单独模型

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

“牙医”和“诊所所有者”的单独模式

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

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

数据库表的命名

关于数据库表的命名。

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

如果诊所所有者也是牙医,我建议将您的表格命名为'dentists',因为它更好地描述了其中的内容。为“用户”表使用不同的名称是的问题。只要您通过userModel选项在Auth组件中指定正确的模型,仍然可以使用该表登录。例如:

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'Dentist',
                // other settings for 'Form' authentication
            )
        )
    )
);

请参阅文档的这一部分:Configuring Authentication handlers

数据库表和模型的示例

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

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关系

“牙医”和“诊所所有者”的更多分离

如果需要,您可以随时为“诊所所有者”(ClinicOwners)设置其他模型,并连接到 与“Dentists”相同的数据库表,默认条件为(user_type = 'C')。如果您需要更多相关信息,我将添加一个示例

<强>更新 根据提供的其他信息提供一些额外提示。

确定DentistsAssistantsClinicOwners是否应该拥有自己的数据库表应该基于它们的用法。如果所有“基本上”相等,除了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在几行中非常困难,因此我建议阅读有关此主题的文档;

Access Control Lists

以及示例:

Simple Acl controlled Application

Simple Acl controlled Application - part 2