2012-03-04 105 views
7

如果你使用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

回答

10

不幸的是,您的當前表結構如何,您無法使用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

5

接受的答案是並不完全正確。你可以使用現有的表結構 - 但你需要實現每個讓你重新命名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