0

たとえば、「user_type」というフィールドを持つ「users」テーブルがあるとします。user_typeが「C」の場合、このユーザーは診療所の所有者であり、user_typeが「D」の場合、このユーザーは歯科医です。

この制度の歯科医は、所属する診療所に所属してほしい。

私の質問は...

  1. 診療所と歯科医のデータベーステーブルが必要ですか?

  2. これらの2つのテーブルが必要ない場合は、必要なモデルの数は、ユーザーモデルまたはクリニックと歯科医のモデルだけですか?

  3. 必要なのがユーザーモデルだけの場合は、ユーザーモデルと関連するリンク($ belongsTo、$ hasMany)を作成する方法を教えてください。

PSクリニックの所有者と歯科医はシステムのユーザーです。

教えてください。ありがとう。


システムの詳細

このシステムは、システムの有料顧客としての診療所の所有者を対象としています。システムは、彼らが歯科医と助手のための求人を宣伝することを可能にします。

歯科医とアシスタントは、クリニックの所有者に雇用された後、システムに登録できます。クリニックの所有者は雇用主になり、システムでの作業の記録を保持します。彼らがクリニックを辞めた場合は、彼/彼女の雇用状況も更新します。

各クリニックが保持している記録は、他のクリニックで見ることができます。

実は雇用主や従業員のモデルのようですが、オンラインシステムのおかげでユーザーモデルを考えました。

私がシステムを決定する場合、ユーザーは最初に登録するだけなので、システムのユーザーになります。その後、雇用者(クリニック/所有者)または従業員(歯科医またはアシスタント)のどちらであるかについて、より多くの情報を入力する必要があります。 、これらの情報は、クリニック、歯科医、アシスタントなどの個別のテーブルに保持され、最終的にCakePHPのモデルがありますか?

ありがとう

4

1 に答える 1

2

この質問に答えてみます。

「クリニック」の別モデル

診療所に関する情報 (住所、名前など) をシステムに保存する場合は、その情報を保存するデータベース テーブルと、その情報を使用するモデルが必要です。

「歯科医」と「クリニック所有者」の別モデル

「歯科医」と「クリニックの所有者」の別々のデータベーステーブルについて、「歯科医」と「クリニックの所有者」の両方がシステムのユーザーであると述べています(おそらく両方ともログインできるはずです)。また、「クリニックのオーナー」は「歯科医」でもある可能性があります。

このため、「ユーザー タイプ」を使用して、その人が (また) クリニック オーナーであるかどうかを示すのは安全だと思います。

データベース テーブルの命名

データベーステーブルの命名について。

歯科医と診療所の所有者はどちらもシステムの「ユーザー」ですが、「ユーザー」が両方を表すのに最適な名前であるかどうかを自問することができます。

クリニックのオーナー歯科医でもある場合は、テーブルに名前を付けることをお勧めします'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'),
        ),
    );
}

私の設計では、診療所の所有者は1 人だけですが、Dentist は複数の診療所を所有できます。診療所が複数の所有者を持つことができる場合は、HasAndBelongsToMany 関係を使用する必要があります

「歯科医」と「クリニック所有者」のさらなる分離

必要に応じて、 「歯科医」と同じデータベース テーブルに接続され、既定の条件 ( ) を持つ「クリニック オーナー」 ( ) の別のモデルをいつでも設定できます。これについてさらに情報が必要な場合は、例を追加しますClinicOwnersuser_type = 'C'

update 提供された追加情報に基づいた、いくつかの追加のヒント。

が独自のデータベース テーブルを持つ必要があるかどうかの決定は、その使用法に基づいて行う必要がありDentistsます。それらを除いて、すべてが「基本的に」等しい場合、それらを同じデータベーステーブルに格納することが可能です。AssistantsClinicOwnerspermissions

それらが同じデータベース テーブルにある場合でも、(便宜上) 同じデータベース テーブルを使用する異なるモデルを作成することができます。次に例を示します。

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 に答える