gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:38:40 24 4
gpt4 key购买 nike

我们有一个可以在一侧处理多种类型对象的链接表,我无法弄清楚如何使用 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"'});

给出“无效的 rel cond val“页面””错误。扔反斜杠没有帮助。

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

The condition needs to be an SQL::Abstract-style representation of the join between the tables



我从那里尝试了各种不同的选择,例如:
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 的现有项目,并且可能还有其他地方将一个表拆分为多个其他表更多麻烦比值得的。

最佳答案

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

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

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

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

关于perl - 如何使用固定连接条件建立 DBIx::Class 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/577190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com