Могу ли я объединить имена столбцов с search_related в DBIx?
У меня есть схема класса DBIx, где у меня есть;
Устройство, которое имеет много интерфейсов
Интерфейс имеет много правил
Каждое правило имеет много записей правил.
Я хочу найти во всех записях правил определенное имя устройства и имя правила.
Я все еще изучаю DBIx, поэтому я не знаю, является ли это даже самым эффективным способом.
Я делаю это так;
my $rs = $self->search( { devicename => ‘DeviceA’ } )->search_related('interfaces')->search_related(’Rules’, { rulename => ‘RuleA’ } )->search_related(‘RuleEntries’, {},
{ columns => [qw/source destination port/], result_class => 'DBIx::Class::ResultClass::HashRefInflator'} );
Я пытаюсь получить Rule Name в виде столбца моего набора результатов.
в настоящий момент я получаю все записи правил для DeviceA с именем RuleN в интерфейсе с именем RuleA, возвращаемые столбцы
‘source destination port’.
Я хочу, чтобы это выглядело как
‘rulename source destination port’
1 ответ
Поскольку вы уже ограничиваете имя правила, нет смысла запрашивать его из базы данных.
Кроме того, вы всегда должны искать объекты того типа, который хотите вернуть, в вашем случае это записи правил:
my $rs = $schema->resultset('Rule_Entries')->search({
'rel_device.name' => 'DeviceA',
'rel_rule.name' => 'Rule',
},{
columns => [ 'rel_rule.name', 'me.source', 'me.destination', 'me.port' ],
join => { rel_rule => { rel_interface => 'rel_device' }},
});
Кажется, вы делаете что-то очень похожее на то, что я делаю: хранение правил брандмауэра. Возможно, вы захотите иметь правило, непосредственно связанное с устройством, и интерфейс является необязательным атрибутом правила, поскольку некоторые поставщики не имеют правил, специфичных для интерфейса (Checkpoint).