1

慣習に従って、同じテーブルへの 2 つの外部キーを持つテーブルを作成する方法。例として、ブログ チュートリアルとチュートリアル Simple Authentication and Authorization Application を取り上げます。このテーブルには、user テーブルを参照する投稿の作成者を表す user_id 投稿があります。保存するテーブルの設計方法は、開発者とは別に、別のユーザーが変更者になる場合があります。

CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(50),
    role VARCHAR(20),
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL,
    user_id INT(11);// cakephp here knows the relationship itself
);

明らかに、修正するユーザーを表す別の列 user_id を追加することはできません。どうすればそれができますか、それは可能ですか?私の英語でごめんなさい

4

1 に答える 1

5

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',
        ),
    );
}
于 2013-03-21T22:08:15.473 に答える