5

CakePHP のリレーションシップを通じて、双方向の自己参照 hasMany に頭を悩ませようとしています (なんて口が悪い!)。

私は画像マッチングのウェブサイトに取り組んでいます。

  • 画像は、「一致」(結合モデル) を介して他の画像に関連付けられます。
  • 各試合には 2 つの写真があり、現在の評価と総投票数が保存されます。
  • 画像を表示する場合、関連するすべての画像がいずれかの方向から (一致を介して) 利用できる必要があります。

結合モデルとの関係を通じて hasMany を定義することから始めました。

pictures_matches 結合テーブルの構造は次のとおりです。

id | picture_id | partner_id | rating | total_votes

私の一致結合モデルの関連付けは次のようになります。

class PictureMatch extends AppModel {

...

    public $belongsTo = array(
        'Picture' => array(
            'className' => 'Picture',
            'foreignKey' => 'picture_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Partner' => array(
            'className' => 'Picture',
            'foreignKey' => 'partner_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
}

各写真は、どちらの方向からでも関連する写真にアクセスできる必要がありますが、これは私の把握が滑っているところです。関係の両側を保存する必要があるように見えますが、これにより、結合モデルに保存されている余分なデータが破棄されます.2 つのデータベース エントリがあると、方向によって投票が異なる可能性があります。

CakePHP でこれを行うための最良の方法を誰かが明らかにすることはできますか? 私はかなり混乱しています。
その場で逆の関係を作成することは可能ですか?

4

3 に答える 3

0

Model::bindModel() を使用してその場で realtions を作成できます。非常に便利なもので、逆の関係や任意の方向をその場でバインドできます。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

また、Containable 動作を使用すると、関連する日付を取得する無限のチェーンを作成できます。

含む('Picture.PictureMatch.Partner.PictureMatch.Picture.....')

基本的に、各チェーンが次のチェーンに何らかの形で関連している限り、すべてのモデルをループして、より簡単な例を説明できます (ロジックは無視してください)。

円は正方形に属する 正方形は三角形に属する

三角形は(直接)円とは関係ありませんが、正方形はその中間です

Circle->find('all', array('...', contain => array('Square.Triangle')); 

またはもっと楽しむために、ループアラウンドでサークルごとに取得しましょう

Circle->find('all', array('...', contain => array('Square.Trinagle.Square.Circle'));

などなど、もちろんこれらの例は役に立たず、プログラミングロジックもありませんが、無限の数のリレーションを行ったり来たりしてループできるという点を理解していただければ幸いです。

于 2013-01-22T15:56:17.007 に答える
0

これが最善の解決策かどうかはわかりませんが、これを行った場合:

public $belongsTo = array(
    'Picture1' => array(
        'className' => 'Picture',
        'foreignKey' => 'picture_id',
    ),
    'Picture2' => array(
        'className' => 'Picture',
        'foreignKey' => 'picture_id',
    ),
    'Partner' => array(
        'className' => 'Partner',
        'foreignKey' => 'partner_id',
    ),
);

次に、検索を行うときに、検索するだけで、1 または 2 に設定し($this->data['Picture1'] == $var || $this->data['Picture2'] == $var)ている限り、その関連データをすべて取得する必要があります。recursivePicture

于 2014-02-21T07:46:06.140 に答える