【问题标题】:How do I make a DBIx::Class relationship with a fixed join condition?如何使用固定连接条件建立 DBIx::Class 关系?
【发布时间】:2010-10-09 07:07:57
【问题描述】:

我们有一个可以在一侧处理多种类型对象的链接表,但我不知道如何使用 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'});

给出一个“Invalid rel cond val page”错误(这对我来说并不奇怪)。

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

给出“无效的 rel cond val "page"”错误。加入反斜杠没有帮助。

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

条件必须是表之间连接的SQL::Abstract 样式表示

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

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

但没有任何成功。

如果我在页表中添加另一个字段,该字段始终包含值“页面”,我可以这样做

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

但这并不是最佳解决方案。

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

【问题讨论】:

  • 你想要“has_many”另一边的“belongs_to”吗?
  • has_many 更重要,所以我选择不要在问题中添加不必要的复杂性。我希望 Brian 的回答能够针对 belongs_to 案例进行修改。

标签: perl dbix-class


【解决方案1】:

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

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

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

如果您有多个表需要这种连接逻辑,这将很容易变成 DBIx::Class 组件。

【讨论】:

  • 那么这如何与 search() 一起使用?我试过: $c->model('Page')->search(undef, {prefetch => "links"})->all;但它说: DBIx::Class::ResultSet::all(): No such relationship links on Page
【解决方案2】:

可以像这样在 has_many 调用中指定:

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

见:DBIx::Class Cookbook

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2011-01-16
    • 2020-10-06
    相关资源
    最近更新 更多