この質問に答えてみます。
「クリニック」の別モデル
診療所に関する情報 (住所、名前など) をシステムに保存する場合は、その情報を保存するデータベース テーブルと、その情報を使用するモデルが必要です。
「歯科医」と「クリニック所有者」の別モデル
「歯科医」と「クリニックの所有者」の別々のデータベーステーブルについて、「歯科医」と「クリニックの所有者」の両方がシステムのユーザーであると述べています(おそらく両方ともログインできるはずです)。また、「クリニックのオーナー」は「歯科医」でもある可能性があります。
このため、「ユーザー タイプ」を使用して、その人が (また) クリニック オーナーであるかどうかを示すのは安全だと思います。
データベース テーブルの命名
データベーステーブルの命名について。
歯科医と診療所の所有者はどちらもシステムの「ユーザー」ですが、「ユーザー」が両方を表すのに最適な名前であるかどうかを自問することができます。
クリニックのオーナーが歯科医でもある場合は、テーブルに名前を付けることをお勧めします'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 関係を使用する必要があります
「歯科医」と「クリニック所有者」のさらなる分離
必要に応じて、 「歯科医」と同じデータベース テーブルに接続され、既定の条件 ( ) を持つ「クリニック オーナー」 ( ) の別のモデルをいつでも設定できます。これについてさらに情報が必要な場合は、例を追加しますClinicOwners
user_type = 'C'
update
提供された追加情報に基づいた、いくつかの追加のヒント。
が独自のデータベース テーブルを持つ必要があるかどうかの決定は、その使用法に基づいて行う必要がありDentists
ます。それらを除いて、すべてが「基本的に」等しい場合、それらを同じデータベーステーブルに格納することが可能です。Assistants
ClinicOwners
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