CakePHP模型与多个外键的关系

时间:2011-05-22 11:39:26

标签: cakephp foreign-keys relationship has-many

在我的CakePHP应用程序中,我有匹配和团队的模型。每个Match都有一个home_team_id和一个away_team_id,两者都引用了不同的团队。

在我的team.php文件中,我能够为团队的主场比赛形成关系:

var $hasMany = array(
  'HomeMatch' => array('className' => 'Match', 'foreignKey' => 'home_team_id'),
  'AwayMatch' => array('className' => 'Match', 'foreignKey' => 'away_team_id')
);

我的问题是我无法在一个阵列中自动检索Team的主页和Matches。也就是说,检索到的匹配在单独的HomeMatch和AwayMatch数组中返回,这会导致排序困难。

我尝试了以下内容:

var $hasMany = array(
  'Match' => array('foreignKey' => array('home_team_id', 'away_team_id'))
);

......没有运气。

关于如何将这两个外键组合成一个关系的任何想法?

谢谢,Ben

3 个答案:

答案 0 :(得分:13)

自定义finderQuery应该可以解决这个问题:

public $hasMany = array(
    'Match' => array(
        'className'   => 'Match',
        'foreignKey'  => false,
        'finderQuery' => 'SELECT *
                            FROM `matches` as `Match`
                           WHERE `Match`.`home_team_id` = {$__cakeID__$}
                              OR `Match`.`away_team_id` = {$__cakeID__$}'
    )
);

答案 1 :(得分:8)

我遇到了类似的问题而不是创建finderQuery我使用了conditions运算符,而且效果很好!

public $hasMany = array(
    'Match' => array(
        'className'   => 'Match',
        'foreignKey'  => false,
        'conditions' => array(
            'OR' => array(
                array('Match.home_team_id' => '{$__cakeID__$}'),
                array('Match.away_team_id' => '{$__cakeID__$}')
            )
        ),
    )
);

答案 2 :(得分:0)

它们以单独的数组返回,因为的种类代表不同的模型(在这种特殊情况下,模型是相同的)。

您应该构建一个辅助方法来检索检索到的数据(在模型对象中或单独的帮助程序类中)并“展平”它。然后你就可以对它进行排序了。