RedBean是否需要“id”主键?

问题描述:

如果你使用ORM,你需要在数据库的每个表中添加一个名为“id”的主键吗?RedBean是否需要“id”主键?

在我的数据库我有几个表有主键对2或3字段,或主键与其他名称比“ID”(是的,我可以更改名称为“ID”,但它wouldn'吨真的反映现实,因为他们都没有标识)

例子:

表1 - 商店帖子:

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 

RedBean会使用这种db结构吗?

+0

据我所知它必须有'id'作为主键。我已经在没有或使用'table_id'的表上试过了,它不起作用。可能有一种方法来定制它的工作,但我没有尝试过。 – 2012-03-04 16:44:43

不幸的是,您的当前表结构如何,您无法使用RedBean。每个表都需要一个自动增量主键。略微下降,因为它使融入已经存在的产品变得更加困难。

几个线程未能利用红豆由于这个约束,从作者的响应,的Gabor德Mooij:

http://groups.google.com/group/redbeanorm/browse_thread/thread/6d5582275326744f?pli=1

http://groups.google.com/group/redbeanorm/browse_thread/thread/4fa7b29b453dcdb8

红豆不需要主键字段然而,仅仅被命名为“id”。您可以使用formatBeanID()方法将主键列的名称格式化为您的喜好,如下面的示例所示,它将表名称有条件地添加到“id”中。例如)表users将主键为users_id。使用该格式,您可以根据需要获取详细的id名称。

http://redbeanphp.com/community/wiki/index.php/Prefixes

希望这个约束将在未来被取消,因为它确实妨碍集成到现有的产品。

编辑:作为一种替代ORM,我听说过很好的教义:http://www.doctrine-project.org/。我没有亲自使用它,但它似乎是许多使用PHP的标准。

编辑2:感谢和信贷杰森是带给关注的新方法集成到红豆在您的数据库可能未设置为它现有的项目。我想更新我的答案,以防人们仍然参考这个问题。 Gabor建议制作映射到表格的视图,您可以在视图中设置视图以获得RedBean所需的适当结构。我没有亲自测试过这个,但它得到了一些用户的正面反馈。它在改变表格时增加了一些额外的开销和维护,但似乎是迄今为止这个问题的最佳和最完整的答案。 http://www.redbeanphp.com/faq#beanformatter

+0

RedBeanPHP 3.0更改日志:“...删除\t Bean格式化程序,您可以不需要定制数据库模式(因为它打破了一切)......”我使用ReadBean v3.2,我应该怎么做? – 2012-09-12 11:17:52

+1

@Ostrovski如果您试图将RedBean集成到已经存在的项目/数据库中,并且您需要由BeanFormatter提供的功能,那么我会实现RedBean 2.2.3。我不确定推出BeanFormatter的理由是什么......看起来RedBean正在向“新项目”领域迈进,在那里你可以实现它和数据库的携手。请检查您是否能够实现2.2.3,或者如果您想/必须使用3.0+,请阅读本文中建议的可能重新实现这些类的内容:https://groups.google.com/论坛/?fromgroups =#!topic/redbeanorm/wXUeT4Tj2uU – king14nyr 2012-09-12 19:07:23

接受的答案是并不完全正确。你可以使用现有的表结构 - 但你需要实现每个让你重新命名PKEY栏是'表的顶部的VIEW ID'...看到的Gabor这封电子邮件 - RedBeanPHP的创造者:

https://groups.google.com/forum/#!searchin/redbeanorm/view/redbeanorm/wXUeT4Tj2uU/3AngnmVwZdYJ

+1

通过对他的建议的回应,这看起来是一个可行的解决方案。这实际上与我在评论中提到的链接相同,看起来线程一直处于活动状态,最近Gabor提供了这种可能的解决方案。我会编辑我的答案,以确保任何人进入此页面不会遇到陈旧,过时或不正确的建议。感谢更新! – king14nyr 2013-12-11 19:52:23

+0

您还可以使用exec()函数来执行任何您感觉的操作。 ID仅适用于豆类,但您仍然可以插入/更新。 – Nick 2016-06-20 15:39:40