Хорошо, я новичок в DBIx :: Class. У меня есть отношения «один ко многим», например:Perl: DBIx :: Class Beginner - Отношения для подмножества и предварительная выборка
User -> has_many -> Addresses
Хорошо, хорошо. Я могу сделать запрос, и вызвать его предварительную выборку соединяемых таблиц, например, так:
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, который возвращает подмножество адресов, основанных на определенных критериях. Вот что я добавил к классу пользователей:
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 к предварительной выборке) ...
Моя проблема в том, что если у меня много перегруженных методов, возвращающих связанные подмножества таблиц, мой счетчик запросов может взорваться; особенно если я вызываю их из цикла.
У меня есть причины для этого, которые, конечно, уродливые. Моя реальная схема жизни много, много, много грязнее, чем пользователи и адреса, и я стараюсь абстрагироваться от уродливых, насколько это возможно.
Спасибо!
Поскольку вы не хотите повторно запрашивать базу данных, почему вы вызываете методы DBIC? Вы не получите никаких преимуществ в отношении запросов, просто напишите методы, которые фильтруют возвращаемые данные с помощью функций perl (например, grep). – MkV
Интересно, почему вы называете их перегруженными методами? Перегрузка в Perl - это когда вы, например, определяете, какой объект должен возвращаться в числовом контексте. –
Потому что я сосать слова. Я думал с точки зрения «перегрузки элемента доступа к столбцу», но на самом деле я просто создаю новый метод доступа. Как бы то ни было, вы знали, что я имел в виду. –