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_joinedscore 等),则该表将需要一个 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 表?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理对话框中的工具栏消息

如何处理带有角度 2 参数的子路由?

XCode 如何处理带有多个目标的#import 标头语句?

CakePhp 1.3 如何处理作为 HTTP post 请求接收的数据?

如何处理带有斜线的 Laravel Eloquent “WHERE”查询? (Laravel 5.3)

使用带有textarea文本的jQuery追加时如何处理回车