为什么DBIx :: Class不能创建多对多访问器?

时间:2011-03-30 15:14:15

标签: perl dbix-class

虽然未创建表之间的creating a schema from a database多对多关系。

这是一个主要问题吗?

是否可以从表结构中检测到存在多对多关系并自动在模式类中创建相应的代码?

2 个答案:

答案 0 :(得分: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本身就能做到这一点。)

答案 1 :(得分: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数据库中使用自动编号等时。我经常需要修改上面的“不要在这行之上修改”的东西(当然,很多事情可以明显低于那个校验和。