Php 红豆需要一个”吗;id";主键?
如果使用ORM,是否需要将名为“id”的主键添加到数据库中的每个表中 在我的数据库中,有一些表的主键对由2或3个字段组成,或者主键的名称不是“id”(是的,我可以将名称更改为“id”,但它不能真正反映实际情况,因为它们不是id) 示例: 表1-商店职位:Php 红豆需要一个”吗;id";主键?,php,database,orm,redbean,Php,Database,Orm,Redbean,如果使用ORM,是否需要将名为“id”的主键添加到数据库中的每个表中 在我的数据库中,有一些表的主键对由2或3个字段组成,或者主键的名称不是“id”(是的,我可以将名称更改为“id”,但它不能真正反映实际情况,因为它们不是id) 示例: 表1-商店职位: id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, title TEXT, content TEXT, 表2-
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
title TEXT,
content TEXT,
表2-帖子的元数据存储:
post INTEGER DEFAULT 0, # <- references "id" from "posts"
name TEXT,
value TEXT,
PRIMARY KEY(name, post),
CONSTRAINT posts_meta FOREIGN KEY(post)
REFERENCES posts(id) ON DELETE CASCADE ON UPDATE RESTRICT
post INTEGER默认值为0,#不幸的是,按照当前表结构的方式,您无法使用RedBean。每个表都需要有一个自动递增主键。这是一个轻微的下降,因为它使得集成到一个已经存在的产品更加困难
由于此限制,一些线程未能使用RedBean,作者Gabor De Mooij对此做出了回应:
但是,RedBean不要求主键字段仅命名为“id”。您可以使用formatBeanID()
方法格式化主键列的名称,如下例所示,该方法有条件地将表名作为“id”的前缀。例如)表users
的主键是users\u id
。使用这种格式,您可以根据需要获得id名称的详细信息
希望这种限制在将来会被解除,因为它确实阻碍了与现有产品的集成
编辑:作为另一种ORM,我听说过很多学说:。我个人没有使用过它,但它似乎是许多使用PHP的人的标准
编辑2:感谢并感谢Jason提出了一种将RedBean集成到现有项目中的新方法,而您的数据库可能没有为此进行设置。我还想更新我的答案,以防人们仍然将其与这个问题联系起来。Gabor建议创建映射到表的视图,在表中可以设置视图,使其具有RedBean所需的适当结构。我没有亲自测试过这个,但它得到了一些用户的积极反馈。它在修改表时增加了一些额外的开销和维护,但似乎是迄今为止解决这个问题的最好和最完整的方法。
公认的答案并非完全正确。。。您可以使用现有的表结构,但需要在每个表的顶部实现一个视图,以便将PKEY列重命名为“id”。。。请参阅来自Gabor(RedbeanHP的创建者)的电子邮件:
据我所知,它必须有id
作为主键。我在没有或有table\u id
的表上试用过,但都不起作用。也许有一种方法可以自定义它,但我还没有尝试。RedBeanPHP 3.0更改日志:“…删除了Bean Formatter,您无法再自定义数据库模式(因为它会破坏一切)…我使用ReadBean v3.2,我应该怎么做?@Ostrovski如果您试图将RedBean集成到现有的项目/数据库中,您需要BeanFormatter提供的功能,我将实现RedBean 2.2.3。我不确定放弃BeanFormatter的理由。。。看起来RedBean正在向“新项目”领域迈进,在那里您可以手牵手地实现它和数据库。检查您是否能够实现2.2.3,或者如果您想/必须使用3.0+,请阅读一些关于重新实现这些类的内容,如本文所建议的:根据对他的建议的回应,这看起来是一个可行的解决方案。这实际上是我在评论中提到的同一个链接,看起来该线程一直处于活动状态,Gabor最近提出了这个潜在的解决方案。我将编辑我的答案,以确保访问此页面的任何人不会遇到旧的、过时的或不正确的建议。谢谢你的更新!您还可以使用exec()函数来执行任何您想要的操作。ID仅适用于bean,您仍然可以随意插入/更新。