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如何处理这种情况/关系?
答案 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。