Хорошо, я новичок в DBIx :: Class. У меня настроены отношения "один ко многим", например:
User -> has_many -> Addresses
Ладно, хорошо. Я могу сделать запрос и называть его предварительной выборкой JOINed таблиц, например:
Foo::DBIC->storage->debug(1); # output SQL to STDOUT
my $user = Foo::DBIC->resultset('Users')->search({}, {
prefetch => [ 'addresses' ],
join => [ 'addresses' ],
rows => 1
})->single;
for my $address ($user->addresses->all) {
say $address->zip_code;
}
Две таблицы, один SQL-запрос (проверено с помощью отладки). Все хорошо.
Теперь, однако, предположим, что я хочу написать один или два метода перегрузки в Foo :: DBIC :: Result :: Users, которые возвращают подмножество адресов на основе определенных критериев. Вот что я добавил в класс Users:
sub home_addresses {
my $self = shift;
return $self->search_related('addresses', { address_type => 'home' });
}
sub business_addresses {
my $self = shift;
return $self->search_related('addresses', { address_type => 'business' });
}
Я могу назвать эти перегрузки так, и они работают:
for my $address ($user->home_addresses->all) {
say $address->zip_code;
}
Однако это игнорирует тот факт, что я предварительно выбрал свое соединение, и выполняет ДОПОЛНИТЕЛЬНЫЕ ЗАПРОСЫ (как если бы я не выполнял предварительную выборку и не присоединялся к чему-либо).
Итак, мой вопрос заключается в следующем: как мне определить метод перегрузки, который возвращает подмножество связанной таблицы, но использует уже предварительно загруженное соединение? (просто добавляя предложение WHERE к предварительной выборке) ...
Моя проблема в том, что если у меня есть много перегруженных методов, возвращающих связанные подмножества таблиц, количество запросов может резко увеличиться; особенно если я вызываю их из цикла.
У меня для этого есть причины, конечно, безобразные. Моя реальная жизненная схема намного, намного, намного запутаннее, чем Пользователи и Адреса, и я пытаюсь абстрагироваться от уродства, насколько могу.
Спасибо!