如何使用固定连接条件创建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"'});

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

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

该条件需要是表之间联接的SQL :: Abstract-style表示形式

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

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的现有项目,并且可能有其他地方将表分成多个其他表更多比它值得的麻烦。


你应该制作一个包装器方法来调用与所需参数的关系:

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

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

如果你有多个需要这种连接逻辑的表,那么这将会变成一个DBIx :: Class组件。


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

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

请参阅:DBIx :: Class Cookbook

链接地址: http://www.djcxy.com/p/42389.html

上一篇: How do I make a DBIx::Class relationship with a fixed join condition?

下一篇: ORM Support for Handling Deadlocks