我可以在DBIx中使用search_related加入列名吗?

时间:2014-08-17 05:16:23

标签: perl orm resultset dbix-class dbix-connector

我有一个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'} );

我想要做的是将'RuleName'作为我的结果集的列。

目前我在名为RuleA的接口上获取带有RuleName的DeviceA的所有规则条目,返回的列是

  ‘source destination port’. 

我希望这看起来像

 ‘rulename source destination port’

1 个答案:

答案 0 :(得分: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' }},
});

看起来你做的事与我的做法非常相似:存储防火墙规则。您可能希望规则与设备直接相关,并且接口是规则的可选属性,因为某些供应商没有特定于接口的规则(检查点)。