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

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.诊所的所有者和牙医是该系统

假设我有一个“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概念编写用户模型???请帮我回答第一个问题。非常感谢你的建议,但由于我英语不好,我可能需要一些时间才能理解你写的所有内容。也因为我解释得不好,你对系统有点误解。我将编辑我的帖子来解释更多关于这个系统的信息。我已经添加了一些额外的信息。但是,我不认为我能够完全回答您的问题,因为这需要为您设计几乎整个应用程序。我想我已经给了你很多信息,可以帮助你进行设计,但是设计这样的应用程序需要时间。这将意味着“创建”应用程序,测试它是否能按您想要的方式工作,如果不能,则“返回绘图板”。我