0

我有两个模型:FightFighter. 我的Fight模型有两个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'
        )
    );
}

这样我就可以设置两个参与战斗的战士。但是,在我的Fighter模型中,我很难确定如何设置关系的另一端。

我知道我想找到所有战斗,其中fighter_a_idorfighter_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它自动生成的(不存在的),将生成WHERE的子句与OR我上面指定的子句结合起来。

错误: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 条记录。或者,您必须有两个 belongsTo 关联。

使用两个 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 的两个关联结果合并到一个名为 Fight 的列表中。在控制器或模型中的 afterFind 回调中执行此操作。

我认为可以这样做。

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

另一种方法是添加另一个表以将 Fighters 与 Fight 相关联。您可以将此表称为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 回答