2011-03-30 53 views
4

雖然creating a schema from a database表之間的多對多關係不會創建。爲什麼DBIx :: Class不能創建多對多訪問器?

這是主要問題嗎?

是否可以從表結構中檢測到存在多對多關係並自動在模式類中創建相應的代碼?

+2

它確實從[v0.07015]開始(http:// cpansearch。 perl.org/src/RKITOVER/DBIx-Class-Schema-Loader-0.07033/Changes)(發佈於2011-12-09) – 2012-09-16 17:04:54

+0

@eugeney:DBIx :: Class開發者真的很棒,我談到了這個以及關於另一個問題是我的Caelum在他們的IRC頻道上,他爲他們提供瞭解決方案,所以現在你可以看到他們在現場了。真棒! – 2012-09-17 08:52:11

回答

2

開發這種代碼的問題在於,包含多個引用的許多表不是多對多的表,並且有多個其他原因引用。例如,我將爲一些虛構的應用程序構建一個架構,在這個應用程序中,某些東西可以被看作是多對多的表格,但事實並非如此。

create table category (
    id primary key, 
    ... 
); 

create table sub_category (
    id primary key, 
    category references category(id), 
    ... 
); 

/* EDIT: 
    This is the table that could be regarded as many_to_many 
    by an automated system */ 
create table product (
    id primary key, 
    category references category(id), 
    sub_category references sub_category(id), 
    ... 
); 

東西可以建立這樣的易用性,而不必做一個網站上的數據庫多表連接,特別是考慮到速度的時候。一段代碼難以明確地說'這不是一個很多'的情況,而開發人員應該能夠輕鬆搞清楚,並且在校驗和下面的many_to_many行中添加。

我認爲DBIX :: Class模式輸出是一個很好的起點,尤其是當在非MySQL數據庫中使用自動編號時,尤其如此。我經常需要修改上面的「不要修改此行以上」的東西(雖然many_to_many顯然可以低於校驗和,當然。)

+0

是的,我認爲類似的情況。但我沒有找到在這種情況下如何可能當存在多對多的訪問器時會出錯,所以訪問者不會被定義爲數據的含義,但它也不會破壞任何東西。或者我錯過了什麼? – 2011-04-07 17:43:28

+0

它不會造成任何破壞,但是這將是不正確。正如系統現在,當默認模式構建時,它不是不正確的,只是不完整。沒有要求使用many_to_many連接器,並且由於這個原因,系統現在不會構建它們。添加它們會增加複雜性,並可能導致錯誤,因此我認爲將其排除是最佳選擇。 – Horus 2011-04-07 19:45:28

+1

我認爲你的答案值得獎勵。儘管如此,我仍然不同意它的各個方面。謝謝你的解釋! – 2011-04-08 15:56:40

5

這的確是一個有些根本性的問題 - MANY_TO_MANY是「關係橋樑」,而不是「關係」。該文檔解釋說,"the difference between a bridge and a relationship is, that the bridge cannot be used to join tables in a search, instead its component relationships must be used."

另一方面,這意味着如果真正的關係被正確發現,它應該是直接自動添加多對多關係:首先,搜索具有兩個或更多個表的has_many關係。然後,對於每一對這樣的關係,建立一個多對多的關係橋樑。 (當然,有人可能希望DBIx :: Class本身可以做到這一點。)

相關問題