dbix may_have и выполнять предварительную выборку отношений при первом доступе?

Пример

У меня есть стол, который может_иметь плату расширения; плата расширения has_many замков

Возможно ли при первом доступе к may_have предварительно выбрать блокировки?

(Да, я знаю, что когда я получу таблицу, я смогу предварительно загрузить доску и ее блокировки; просто интересно, нужно ли мне делать это таким образом.)

package Table;

__PACKAGE__->might_have("expansion_board", "ExpansionBoard",
{ "foreign.boardid" => "self.boardid" });

#etc.

package ExpansionBoard;

__PACKAGE__->has_many("locks","Lock",
{ "foreign.boardid" => "self.boardid" },
undef);

#etc.

package Lock;

#etc.

Я бы больше всего хотел, чтобы $table->expansion_board при первом доступе также загружала свои блокировки из базы данных.


person melutovich    schedule 29.07.2016    source источник
comment
Я не понимаю вопроса. Не могли бы вы отредактировать и уточнить, что вы пытаетесь сделать. Пожалуйста, используйте правильную разметку встроенного кода для вещей, которые являются методами или значениями конфигурации. Очень тяжело читать ваш вопрос.   -  person simbabque    schedule 29.07.2016
comment
@simbabque обновлен; вы также можете посмотреть ответ nwellnhof.   -  person melutovich    schedule 29.07.2016


Ответы (1)


IIUC, у вас есть что-то вроде

my $board = $result->expansion_board;

и хотите выполнить предварительную выборку замков платы. В этом случае вы можете использовать метод search_related с prefetch атрибут:

my $board = $result->search_related('expansion_board', undef, {
    prefetch => 'locks',
})->single;

Или вы можете попробовать метод find_related:

my $board = $result->find_related('expansion_board', undef, {
    prefetch => 'locks',
});
person nwellnhof    schedule 29.07.2016
comment
Кэширует ли ваша предварительная выборка отношения доски и блокировок, чтобы $result-›expansion_board и $result-›expansion_board-›locks больше не нуждались в БД? Есть ли способ настроить эту настройку так, чтобы при первом появлении моей $board = $result-›expansion_board; бы одновременно с загрузкой в ​​extension_board еще и замки получить. (т.е. старый код использует $result-›expansion_board ) - person melutovich; 29.07.2016
comment
@melutovich (1) Единственное, что я знаю точно, это то, что $board->locks не должен попадать в БД. Я не думаю, что другие обращения через исходный $result кэшируются. Попробуйте запустить DBIC с трассировкой SQL и посмотрите на генерируемые операторы. (2) Возможно, вы могли бы попытаться переопределить метод expansion_board в результирующем классе, но я бы не рекомендовал этого делать. - person nwellnhof; 29.07.2016