5

username両方にフィー​​ルドを持つ2つのテーブルがあります。ローカル テーブルと外部テーブルの両方にフィー​​ルド名を指定するにはどうすればよいですか?

私はCakePHPが次のようなことをしたい

ON (`T1`.`username` = `T2`.`username`)`

結果として。変更がなければ、テーブルは次の条件で結合されます。

ON (`T1`.`id` = `T2`.`t1_id`)`

次のようなクエリが生成されるため、プロパティを設定'foreign_key' = 'username'するだけでは不十分です。

ON (`t1`.`id` = `t2`.`username`)`

私には2つの解決策があります。最初の 1 つは、'join' プロパティを使用して、その場でテーブルを結合することです。そのような場合、ローカル フィールドと外部フィールドの両方を設定できます。しかし、手動で結合したそのテーブルにさらにテーブルを結合する必要がある場合、contains を使用できなくなり、その関連付けが正しく設定されていても、次の結合を手動で記述する必要があります。そのため、毎回使用する代わりに長い結合定義を記述する必要があります'contain' => array('T1', 'T2', 'T3')

2 つ目は、テーブルの「primary_key」を対応するフィールドに設定することです。モデルファイルまたはランタイムで実行できます。私の場合、そのテーブルにもその'id'フィールドによる「正しい」関連付けがあるため、モデルでは実行できません。ランタイムをセットアップするのは事実ですが、明らかではなく、ハックのように見えるので嫌いです。

私がこの質問をするとき、私は明らかな何かが欠けていると思っていましたが、今ではCakePHPがそれを行うことができないことを理解しています. だから私は誰かが解決策を共有することを期待して賞金を始めました. そうでない場合は、ケーキのソースを読み取り、モデルの一部を再定義して'foreign_key'、関連定義の近くにローカル フィールドを定義する機能を追加しようとします。

4

5 に答える 5

14

ForeignKey false

結合条件で関連モデルの主キーを使用しない関連付けを行うには、標準的な方法で を使用します'foreignKey' => false

つまり、この関連付けは次のとおりです。

class Comment extends AppModel {
    public $belongsTo = array(
        'Profile' => array(
        )
    );
}

このSQLを生成します:

SELECT ... LEFT JOIN profiles on ON (Profile.id = Comment.profile_id)

次のように、foreignKey を使用しないように指定します。

class Comment extends AppModel {
    public $belongsTo = array(
        'Profile' => array(
            'foreignKey' => false
        )
    );
}

この(無効な)SQLを生成します:

SELECT ... LEFT JOIN profiles on ON ()

この時点から、条件配列キーを使用して目的の条件を指定できます。

class Comment extends AppModel {
    public $belongsTo = array(
        'Profile' => array(
            'foreignKey' => false,
             'conditions' => array(
                 'Comment.username = Profile.username'
             ),
        )
    );
}

(条件は文字列として定義されることに注意してください)結果は次のようになります。

 SELECT ... LEFT JOIN profiles on ON (Comment.username = Profile.username)
于 2014-03-04T08:55:39.127 に答える
3

ユーザーと彼のすべてのコメントを取得したいときに hasMany 関係で機能するはずの回避策

class User extends AppModel {
    public $hasMany = array(
        'Comment' => array(
            'finderQuery' => 'SELECT * FROM comments Comment 
                              LEFT JOIN users User 
                              ON Comment.username = User.username 
                              WHERE User.id = {__CakeID__}'
        )
    );
}

それが役に立てば幸い

于 2014-03-04T07:20:17.820 に答える
1

私はこの正確な問題に何日も苦労しましたが、私が見つけた解決策 (上記で明確に対処されていません) は次のhasManyとおりです。連想配列ではなく文字列として。そのようです:'foreignKey' => falsebelongsTo'foreignKey' => false'conditions' => 'Comment.username = User.username'conditions

// Profile
public $hasMany = array(
    'Comment' => array(
        'foreignKey' => false,
    )
);

// Comment
public $belongsTo = array(
    'Profile' => array(
        'foreignKey' => false,
        'conditions' => array('Profile.username = Comment.username')
    )
);
于 2014-07-17T16:21:49.727 に答える
0
public $hasMany = array(
    'Comment' => array(
        'className' => 'T1',
        'foreignKey' => 'username',
        'dependent' => true
    )
);

T2 が Cake 内から削除された場合、依存する true はすべての T1 を削除することに注意してください。

于 2013-11-11T17:36:20.843 に答える