如何使用固定连接条件建立DBIx :: Class关系?

时间:2009-02-23 10:43:44

标签: perl dbix-class

我们有一个链接表,可以在一侧处理多种类型的对象,我无法弄清楚如何使用has_many从这些对象中的一个到达链接表。

示例:链接表包含:

id link_id link_table resource_id
1  1       page       3
2  1       page       5
3  2       page       3
4  1       not_page   1

从资源方面建立关系很容易:

Resource->has_many(links => 'Link', 'resource_id');

但是我无法从页面方面获得相应的关系:

Page->has_many(links => 'Link', 'link_id');

会获得not_page链接

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'page'});

给出了“无效的rel cond val页面”错误(这对我来说并不令人感到意外)。

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => '"page"'});

给出了“无效的相关信息”页面错误。投掷反斜杠并没有帮助。

DBIx::Class::Relationship::Base说:

  

条件需要是表格之间联接的SQL::Abstract - 样式表示

我从那里尝试了各种不同的选项,例如:

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => {'=', 'page'}});

但完全没有任何成功。

如果我在页面表中添加了另一个字段,该字段始终包含值'page',我可以

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'self.what_table_am_i'});

但这不是最佳解决方案。

将链接表拆分为每种类型的单独一个可能是可能的,但这是一个正在考虑适应DBIx :: Class的现有项目,并且可能有其他地方将表拆分为多个其他桌子比它的价值更麻烦。

2 个答案:

答案 0 :(得分:3)

您应该创建一个使用所需参数调用关系的包装器方法:

Page->has_many(__all_links => 'Link', 'link_id');

sub links {
    shift->__all_links({link_table => 'page'});
}

如果您有多个需要具有此类连接逻辑的表,那么很容易变成DBIx :: Class组件。

答案 1 :(得分:1)

可以在has_many调用中指定,如下所示:

Page->has_many(links => 'Link', 'link_id',
                    { where => { link_table => 'page'} });

请参阅:DBIx::Class Cookbook