0

と の 2 つのモデルがFightありFighterます。私のFightモデルには 2 つのbelongsTo関係があります。

<?php
class Fight extends AppModel {
    public $belongsTo = array(
        'FighterA' => array(
            'className' => 'Fighter',
            'joinTable' => 'fighters',
            'foreignKey' => 'fighter_a_id'
        ),
        'FighterB' => array(
            'className' => 'Fighter',
            'joinTable' => 'fighters',
            'foreignKey' => 'fighter_b_id'
        )
    );
}

これは、戦闘に参加する 2 人のファイターを設定できるようにするためです。しかし、私のFighterモデルでは、関係の反対側を設定する方法を理解するのに苦労しています。

fighter_a_idまたはfighter_b_id列のいずれかが戦闘機 ID と等しいすべての戦いを検索したいことはわかっていますが、これをモデルの関係に変換するのに問題があります。

私はもう試した:

<?php
class Fighter extends AppModel {
    public $hasMany = array(
        'Fight' => array(
            'conditions' => array(
                'OR' => array(
                    'Fight.fighter_a_id' => 'Fighter.id',
                    'Fight.fighter_b_id' => 'Fighter.id'
                )
            )
        )
    );
}

しかし、CakePHP はエラーをスローします。そこでは、生成された句と上で指定した句をfighter_id組み合わせて、自動的に生成された (存在しない) をクエリしようとしています。WHEREOR

エラー: SQLSTATE[42S22]: 列が見つかりません: 1054 不明な列 'Fight.fighter_id' が 'フィールド リスト' にあります

そして、生成された SQL ステートメント:

SELECT Fight.id, Fight.fighter_a_id, Fight.fighter_b_id, Fight.event_id, Fight.weight_division_id, Fight.rounds, Fight.rounds_length, Fight.winner, Fight.winning_round, Fight.winning_time, Fight.win_method, Fight.fighter_id FROM fights AS Fight WHERE ((Fight.fighter_a_id = 'Fighter.id') OR (Fight.fighter_b_id = 'Fighter.id')) AND Fight.fighter_id = (1)

テーブルからレコードを検索するときに、fighters関連するモデルもリストしたいと思いFightます (時系列順ですが、この問題とは関係がないため、別の列で処理されます)。

4

2 に答える 2

0

どの戦士が戦いに属するかを保持する追加のテーブルを追加し、それを戦いごとに 2 つのレコードに制限する必要があります。または、2 つの belongsTo アソシエーションが必要です。

2 つの belongsTo アソシエーションを使用すると、Fight モデルは次のようになります。

class Fighter extends AppModel {
    public $hasMany = array(
        'FightA' => array(
             'className'=>'Fight',
             'foreignKey'=>'fighter_a_id'
        ),
        'FightB' => array(
             'className'=>'Fight',
             'foreignKey'=>'fighter_b_id'
        )
    );
}

次に、FightA と FightB の 2 つの関連する結果を、Fight という 1 つのリストにマージできます。これはコントローラーで行うか、モデルの afterFind コールバックで行うことができます。

このようなことができると思います。

 $fights = $this->Fighter->find(....);
 $fights['Fighter']['Fight'] = $fights['Fighter']['FightA']+$fights['Fighter']['FightB'];

もう 1 つの方法は、ファイターをファイトに関連付ける別のテーブルを追加することです。このテーブルは、fight_members と呼ぶことができます。

シンプルなテーブルになります。

CREATE  TABLE `fight_members` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `fighter_id` INT UNSIGNED NOT NULL ,
  `fight_id` INT UNSIGNED NOT NULL ,
PRIMARY KEY (`id`) );

ファイターが属するすべてのファイトを見つけることができるようになりました。

class Fighter extends AppModel {
    public $hasMany = array('FightMember');
}

class Fight extends AppModel {
     public $hasMany = array('FightMember');
);

class FightMember extends AppModel {
     public $belongsTo=array('Fight','Fighter');
);
于 2013-01-15T02:09:56.587 に答える
0

Fighter モデルに条件を設定しないでください。モデルを単純にする:

class Fighter extends AppModel {
  var $hasMany = 'Fight';
}

次に、コントローラーでロジックを実行し、戦闘機の戦いをトレーニングします。

public function index($id = null) {     
        if (!$id) {
        }
        $fighter = $this->Fighter->findById($id);
        if (!$project) {
            throw new NotFoundException(__('Invalid fighter'));
        } else {
            $this->set('fighter', $fighter);

            $fights = $this->Fighter->Fight->find('all', array('conditions' => array(
            'OR' => array(
                'Fight.fighter_a_id' => 'Fighter.id',
                'Fight.fighter_b_id' => 'Fighter.id'
            )
        )));
            $this->set('fights', $fights);
        }
}
于 2013-01-14T21:38:35.103 に答える