3

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

4

7 回答 7

8

var $primaryKey = 'example_id'; $primaryKey 是您要查找的内容。

只需将其放在您的模型类上。

于 2010-08-10T08:03:57.183 回答
5

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 约定。

于 2009-03-25T08:37:20.877 回答
3

CakePHP 不支持复合主键。将一个名为“id”的主键添加到您的 game_players 表中。模型和数据库约定

于 2009-03-25T03:50:04.157 回答
2

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

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

于 2009-03-25T08:48:14.813 回答
0

根据您的时间和精力,继续添加 id 字段会更好吗?您最终可能会以意想不到的方式扩展此表的需求。

只是一个建议。

于 2009-03-25T03:36:20.587 回答
0

正如其他人所提到的,你的桌子应该被称为games_players并且你永远不应该直接使用它(蛋糕会自动处理它)。您必须设置 Game 和 Player 模型之间的关系,并让蛋糕负责其余的工作。

于 2009-03-25T15:26:07.137 回答
0

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

于 2020-01-21T13:07:14.467 回答