CakePHP如何处理带有/不带'id'字段的HABTM表?

时间:2009-03-25 03:02:19

标签: php sql cakephp

CakePHP如何处理没有id列的表?

HABTM是一个“拥有并且属于许多”的表,这意味着多对多的数据库关系

我正在尝试保存一些关系数据,但是Cake想要“SELECT LAST_INSERT_ID()”,但是它尝试保存的表没有id列,所以id用于不同的表。

具体来说,我有“游戏”和“玩家”的表格,以及一个名为“game_players”的关系表。 game_players有字段game_id和player_id,而且在这张桌子上我无法保存关系数据。

澄清一下:这是导致问题的game_player表。该表没有,也没有id字段。它只存储玩家和游戏之间的关系,主键是(game_id,player_id)

CakePHP如何处理这种情况/关系?

7 个答案:

答案 0 :(得分:8)

var $primaryKey = 'example_id'; $ primaryKey是你在寻找什么。

只需将其放在模型类上即可。

答案 1 :(得分:5)

游戏HABTM播放器,反之亦然?如果是这样,您的联接表games_players上不应该有ID字段。您应该能够通过使用像

这样的数据数组调用保存游戏来保存数据
$this->Game->save(array(
  'Player'=>array(
    'Player'=>array(
      1,4,5,9 // Player IDs
    )
  )
));

在这种情况下,Cake不会尝试获取最后一个插入ID。

但是,如果游戏没有HABTM播放器,并且您直接在模型GamePlayer上调用save,它应该有一个ID字段以符合Cake约定。

答案 2 :(得分:3)

CakePHP不支持复合主键。将一个名为“id”的主键添加到game_players表中。 Model-and-Database-Conventions

答案 3 :(得分:1)

在正常情况下,您的联接表实际上应该被称为 games_players 而不是 game_players - 如果该表名为game_players,那么您需要告诉Cake这个各自的模型文件。

如果它只是一个连接表,那么通常不需要id字段。在某些情况下,您可能希望将id(或其他字段)添加到您的联接表中,但您不必这样做。

答案 4 :(得分:0)

作为您的时间和精力问题,继续添加ID字段会更好吗?您最终可能会以您未曾预料到的方式扩展此表的需求。

只是一个建议。

答案 5 :(得分:0)

正如其他人所提到的,你的桌子应该被称为 games_players ,你永远不应该直接使用它(蛋糕会自动处理)。你必须在游戏和玩家模型之间建立你的关系,然后让蛋糕来处理剩下的事情。

答案 6 :(得分:0)

“ Cake应用程序数据库中的所有表都必须具有ID作为表的主键。” (CakePHP应用程序开发的第3章,由Anupom Syam和Ahsanul Bari撰写,由Packt Publishing发布)。参见http://jaimemontoya.com/cakephp-application-development/#20191203155934