CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?
Posted
技术标签:
【中文标题】CakePHP 如何处理带有/不带有 \'id\' 字段的 HABTM 表?【英文标题】:How does CakePHP handle HABTM tables with / without an 'id' field?CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表? 【发布时间】:2009-03-25 03:02:18 【问题描述】:Cakephp 如何处理没有id
列的表?
HABTM 是一个“has and belongs to many”表,表示多对多的数据库关系
我正在尝试保存一些关系数据,但 Cake 想要“SELECT LAST_INSERT_ID()”,但是它尝试保存到的表没有 id 列,因此 id 用于不同的表。
具体来说,我有“游戏”和“玩家”表,以及一个名为“game_players”的关系表。 game_players有game_id和player_id这两个字段,在这张表上我无法保存关系数据。
澄清一下:这是导致问题的 game_player 表。该表没有也不应该有 id 字段。只存储玩家与游戏的关系,主键为(game_id, player_id)
CakePHP 如何处理这种情况/关系?
【问题讨论】:
我不知道 CakePHP 是怎么处理的,但是你为什么没有 ID? 该表不需要它。 PK 是 (game_id, player_id)。这是一个严格的关系表。 【参考方案1】:var $primaryKey = 'example_id';
$primaryKey 就是你要找的东西。
只需将其放在您的模型类中即可。
【讨论】:
【参考方案2】:Game HABTM 播放器,反之亦然?如果是这样,您的连接表 games_players 上不应有 ID 字段。你应该可以通过调用 Game 上的 save 来保存数据,比如
$this->Game->save(array(
'Player'=>array(
'Player'=>array(
1,4,5,9 // Player IDs
)
)
));
在这种情况下,Cake 不会尝试获取最后一个插入 id。
但是,如果 Game 没有 HABTM Player,并且您直接在模型 GamePlayer 上调用 save,它应该有一个 ID 字段以符合 Cake 约定。
【讨论】:
【参考方案3】:CakePHP 不支持复合主键。将一个名为“id”的主键添加到您的 game_players 表中。 Model-and-Database-Conventions
【讨论】:
【参考方案4】:在正常情况下,您的连接表实际上应该被称为 games_players 而不是 game_players - 如果该表被称为 game_players 那么您需要在您的相应的模型文件。
如果它只是一个连接表,那么它通常不需要 id 字段。在某些情况下,您可能希望将 id(或其他字段)添加到联接表中,但您不必这样做。
【讨论】:
旧帖子,但对碰巧像我一样遇到此问题的任何人发表了评论。我不确定 2009 年的情况是否如此,但目前情况并非如此。我通常在这个约定中命名我的表,然后蛋糕就可以了:游戏 game_players game_player_logs 最后一部分应该总是复数,其他部分应该是单数。【参考方案5】:根据您的时间和精力,继续添加 id 字段会更好吗?您最终可能会以意想不到的方式扩展此表的需求。
只是一个建议。
【讨论】:
是的,很好的建议。如果您需要向连接表添加字段(例如date_joined
、score
等),则该表将需要一个 id,然后您必须将连接表作为不同的模型引用。【参考方案6】:
正如其他人所提到的,你的桌子应该被命名为 games_players 并且你永远不应该直接使用它(蛋糕会自动处理它)。您必须设置 Game 和 Player 模型之间的关系,并让蛋糕负责其余的工作。
【讨论】:
【参考方案7】:“Cake 应用程序数据库中的所有表都必须以 id 作为表的主键。” (CakePHP 应用程序开发的第 3 章,作者 Anupom Syam 和 Ahsanul Bari,Packt Publishing 出版)。见http://jaimemontoya.com/cakephp-application-development/#20191203155934。
【讨论】:
以上是关于CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?的主要内容,如果未能解决你的问题,请参考以下文章
XCode 如何处理带有多个目标的#import 标头语句?
CakePhp 1.3 如何处理作为 HTTP post 请求接收的数据?