2011-05-22 91 views
8

在我的CakePHP应用程序中,我有匹配和团队的模型。每场比赛都有一个home_team_id和一个away_team_id,两者都引用不同的球队。CakePHP模型与多个外键的关系

在我team.php文件,我能形成一支球队的主场比赛的关系:

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

我的问题是,我不能自动检索球队的主客场在一个阵列相匹配。也就是说,检索到的匹配会返回到单独的HomeMatch和AwayMatch数组中,这会导致排序困难。

我曾尝试以下:

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

...没有运气。

有关如何将这两个外键合并为一个关系的任何想法?

谢谢,本

回答

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__$}' 
    ) 
); 
+0

谢谢你的完美! – Ben 2011-05-22 20:58:49

+0

这真棒。 – 2011-06-01 05:48:34

0

他们是在单独的磁盘阵列的返回,因为那种代表不同的模型(在此特定情况下,模型是一样的)。

你应该建立一个帮助器方法来检查检索到的数据(在模型对象中或在一个单独的辅助类中)并将其“变平”。那么你就可以对其进行分类。

Ken。

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__$}') 
      ) 
     ), 
    ) 
);