CakePHP の規則は、いくつかの理由で作成されています。一貫性を保ち、アプリケーションを機能させるために必要な構成の量を減らすことができます。
ただし、CakePHP は、規則に従わない命名を使用することを禁止していません。場合によっては、慣習を無視する必要があり (CakePHP の慣習に従わない CakePHP プロジェクトに使用されるサードパーティのデータベースを考えてみてください)、あなたの状況はその 1 つです。
「同じ」モデルへの複数の関係
Cake では、各リレーションのモデルに異なるエイリアスを設定できます。このようにして、競合することなく、質問で説明したことを達成できます。ただし、2 番目のリレーションの外部キーは CakePHP の規則に従っていないため、CakePHP は自動的に正しい列を選択しません。そのため、これを自分で指定する必要があります。
例えば
class Post extends AppModel {
public $belongsTo = array(
// CakePHP will automatically use 'user_id' as foreign key
'User',
// Here we create an 'alias' for the User Model
// also, we need to specify the foreign key to use
// for the relation
'Editor' => array(
'className' => 'User', // name of the Model
'foreignKey' => 'editor_id', // foreign key for this relation
),
);
}
Post
モデルには、モデルに対する2 つのリレーションがありUser
ます。エイリアスを持つもの エイリアスEditor
は「通常の」モデルと同じように機能します。Editor
つまり、Post にアタッチされたモデルがあったのと同じです。
コントローラーでは、両方ともfind()
すべてのユーザーを返し、実際には「ユーザー」モデルを使用します。
$this->Post->User->find('all');
$this->Post->Editor->find('all');
重要
CakePHP はエイリアスを使用してモデル情報をキャッシュします。モデルにエイリアスを使用する場合は、別のモデルに同じエイリアスを使用しないでください。そのような状況では、CakePHP は他のモデルのキャッシュされた情報を使用する可能性があり、予測できない結果につながります!
例えば
class Post extends AppModel {
public $belongsTo = array(
'Editor' => array(
'className' => 'User',
'foreignKey' => 'editor_id',
),
);
}
class Comment extends AppModel {
public $belongsTo = array(
'Editor' => array(
'className' => 'Visitor', // WRONG!! Editor alias is already
// used as alias for the User model!
'foreignKey' => 'editor_id',
),
);
}