2011-03-30 26 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本身可以做到这一点。)