2

歯科検査システムのユーザーに関するデータを保存するために使用される User モデルがあります。

通常、3 種類のユーザーが存在します: AdmininistratorLocation ManagerおよびExaminerです。

私のアプリケーションでは、これら 3 つの役割を別々のモデルとして扱うことが必要になったようです (役割ごとに異なるオプションを使用して異なるビューを作成する方法を想像してみてください... 悪夢です)。

各モデルで関係を設定するにはどうすればよいですか。

私の最初の考えは次のとおりです。

//Administrator Model
class Administrator extends User {
    $name = 'Administrator';
    $table = 'User';
    $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'conditions' => array('User.role' => 'administrator'), 
        )
    );
}

そして、User モデルは hasMany? を使用してこれを参照します。CakePHP の規約に関して、実際にこれを正確にモデル化するにはどうすればよいでしょうか?

また、このモデルは User モデルまたは AppModel を拡張しますか?

4

1 に答える 1

2

もちろん、同じテーブル名を使用して異なるモデルを作成できます。これを行うには、各モデルを $useTable プロパティ ($table ではない) で特定のテーブルにリンクします。

class Administrator extends AppModel {
    public $useTable = 'User';
}

しかし、結果をフェッチするときに返されるデータをフィルタリングできるようにするCakePHPモデルプロパティはわかりません...モデルを別のモデルとリンクする場合にのみ、独自の条件を書くことができます。次に例を示します。

class SomeOtherModel extends AppModel {
    public $hasMany = array(
        'Administrator' => array(
            'className' => 'Administrator',
            'conditions' => array('Administrator.role' => 'administrator')
        )
    );
}

SomeOtherModel モデルのクエリを実行する場合にのみ機能するため、これは良い解決策ではありません。

Administrator / Examiner / ... モデルに afterFind() コールバックを適用して、必要以上に別の役割のユーザーを削除することもできますが、もちろん効率的な解決策ではありません。

別の解決策は、選択した役割のユーザーのみを含むさまざまなデータベース ビューを作成することです (ビューの詳細 -ここ)。次に、通常のデータベース テーブルと同じように、各ビューを CakePHP モデルに向けることができます。しかし、この解決策も完璧ではありません。将来、新しいユーザー ロールを追加したり、テーブル スキーマを変更したりする必要がある場合は、データベース ビューも変更する必要があります。

于 2013-10-04T16:33:45.993 に答える