我们有一个链接表,可以在一侧处理多种类型的对象,我无法弄清楚如何使用has_many从这些对象之一到链接表.
示例:链接表包含:
Run Code Online (Sandbox Code Playgroud)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');
Run Code Online (Sandbox Code Playgroud)
但我无法从页面方面获得相应的关系:
Page->has_many(links => 'Link', 'link_id');
Run Code Online (Sandbox Code Playgroud)
会得到not_page链接
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'page'});
Run Code Online (Sandbox Code Playgroud)
给出了"无效的rel cond val页面"错误(这对我来说并不奇怪).
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => '"page"'});
Run Code Online (Sandbox Code Playgroud)
给出"无效的相关信息"页面"'错误.投掷反斜杠并没有帮助.
DBIx :: Class :: Relationship :: Base说:
条件必须是表之间连接的SQL :: Abstract风格表示
我从那里尝试了各种不同的选择,例如:
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => {'=', 'page'}});
Run Code Online (Sandbox Code Playgroud)
但没有任何成功.
如果我在页表中添加了另一个字段,它总是包含值'page',我可以这样做
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'self.what_table_am_i'});
Run Code Online (Sandbox Code Playgroud)
但这不是最佳解决方案.
将链接表拆分为每种类型的单独一个可能是可能的,但这是一个正在考虑适应DBIx :: Class的现有项目,并且可能有其他地方将表拆分为多个其他表更多比它的价值更麻烦.
您应该只创建一个包装方法来调用具有所需参数的关系:
Page->has_many(__all_links => 'Link', 'link_id');
sub links {
shift->__all_links({link_table => 'page'});
}
Run Code Online (Sandbox Code Playgroud)
如果您有多个需要这种连接逻辑的表,那么这将很容易变成 DBIx::Class 组件。
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |