Могу ли я иметь отношения "Родитель has_many GrandChildren через детей" в 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 ответ

Решение

Я получил большую помощь от #dbix-class, Там не может быть способа явно определить :through отношения ActiveRecord-style, но есть способ захватить потомков вниз по цепочке результатов.

С использованием ResultSet Метод search_related, вы можете достичь через отношения и использовать дочерние методы доступа. Например, в моем родительском классе:

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

    return \@gchildren;
}

поскольку search_related возвращает набор результатов, я думаю, вы могли бы связать эти search_related звонки так далеко, как вы хотите.

Другие вопросы по тегам