我们有一个可以在一侧处理多种类型的对象的链接表,但我不知道如何使用 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”错误(这对我来说并不奇怪)。
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 的现有项目,可能还有其他地方将一个表拆分为多个其他表更多比它的价值麻烦。