Могу ли я иметь отношения "Родитель 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
звонки так далеко, как вы хотите.