2013-04-18 156 views
0

一般情况下,我可以在CakePHP通过不同名称与另一个模型的列关联的表中创建外键(即列)吗?顺便提一句,我正在使用bake all开始设置标准CRUD。Cakephp 2.3:当外键与模型列不匹配时,建立模型关联

我的问题的一般形式是:

Table_Aid | label | TableB_labelA_id | TableB_labelB_id

Table_B has id | label

为了使问题的休息少难看,不过,这是我目前的应用:

gamesid | date | us | them

teams has id | name

我认为这可以通过别名和关联定义来实现,但我不太清楚。我也想到简单地创建UsThem模型,扩展Team,但这似乎是一个不必要的努力。

我也注意到,在我Game modelUsThem$belongsTo阵列中列出,而不是$hasMany这将直观地都显得更正确。

想法?我会非常感激!

+1

我是否明白'Us'和'Them'都是'teams.id'的外键?如果是这种情况,那么'$ belongsTo' ** _是正确的关系** – thaJeztah

+0

哦,也许我误解了这一点。在上面的例子中,我的“游戏”模型的$ belongsTo数组意味着游戏属于“us”和“them”,或者属于“game”的东西列表包含“us”和“ them'? – Jonline

+1

好吧,有时候'belongsTo'这个名字很混乱。在你的情况下,游戏“属于”你*和*他们; *游戏*并不拥有它的玩家。一些解释可以在这里找到[一对多](http://en.tekstenuitleg.net/articles/software/database-design-tutorial/one-to-many.html) – thaJeztah

回答

2

你是对的只需要别名和适当的关联定义。这是你需要的。

class Game extends AppModel { 
    public $belongsTo = array(
     'Us' => array(
      'className' => 'Team', 
      'foreignKey' => 'us' 
     ), 
     'Them' => array(
      'className' => 'Team', 
      'foreignKey' => 'them' 
     ), 
    ); 
} 

烘烤将无法帮助你。如果所有的命名都是按照惯例进行的,并且在这种情况下这是不可能的,它只能使它受到教育的猜测。

+0

嗯,谢谢你,虽然我现在觉得有点受骗了,因为我先试了一下(这看起来像是直觉选择),但它没有奏效。不过,我必须改变其他地方的东西,因为它现在运行得很好。谢谢。 – Jonline

+1

虽然我会建议使用比“我们”和“他们”更好的字段名称。像“home_team_id”和“away_team_id”这样的内容会更具可读性,并且与Cake的命名约定一致,即外键字段名以“_id”结尾 – ADmad

+0

谢谢,是的,事实上,我一直使用“us_id”和“them_id”作为在我发布的一般形式中,我只是在示例中省略了它,以减少视觉混乱。这让我的一天更顺畅,哈哈,再次感谢。 :) – Jonline