我可以在DBIx :: Class中拥有“通过子级实现父母与孩子的关系”吗?

时间:2009-03-13 16:14:50

标签: perl orm dbix-class

我想拥有这样的功能:

$parent->get_grandchildren_by_category({category => 'foo'});

我可以通过简单的链式连接在父类之外轻松完成:

$schema->resultset('Parent')->search(
    {
        'me.id' => 62,
        'grandchildren.category' => 'foo'
    },
    {
        join => {'children' => 'grandchildren'}
    }
);

但是在父类中,我没有访问(也不应该)访问架构对象。 在父类中,我可以访问$self->children但是返回子项的结果集,我必须迭代它们以获得每个grandchildren

我有什么方法可以定义这种ActiveRecord风格吗?

class Parent < ActiveRecord::Base
   has_many :children
  has_many :grandchildren, :through => :children
end

1 个答案:

答案 0 :(得分:1)

我从#dbix-class得到了很多帮助。可能没有办法明确定义ActiveRecord风格的:through关系,但是有一种方法可以让孩子们进一步抓住结果链。

使用ResultSet的{​​{3}}方法,您可以通过关系来使用孩子的访问者。例如,在我的Parent类中:

sub get_grandchildren_by_category{
    my ($self, $category) = @_;
    my @gchildren = $self->children->search_related('grandchildren'
        {
             'grandchildren.category' => $category
        }
    );

    return \@gchildren;
}

由于search_related会返回结果集,我猜您可以根据需要链接这些search_related次调用。