如何在 DBIC 中找到未知数量的结果集的并集?
how to find the union of an unknown number of resultsets in DBIC?
您好,我正在使用 Helper::ResultSet::SetOperations 库来查找某些结果集的并集和交集。如果我知道结果集的数量,那么一切正常,但是我试图让它为未知数量的结果集工作。
处理 3 时以下工作 'devices'
my $firstdevice = shift @{$devices};
my $rs1 = $self->search({ 'devices.devicename' => $firstdevice }, { join => { devicetype => 'devices' }, result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my $seconddevice = shift @{$devices};
my $rs2 = $self->search({ 'devices.devicename' => $seconddevice }, { join => { devicetype => 'devices' },result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my $thirddevice= shift @{$devices};
my $rs3 = $self->search({ 'devices.devicename' => $thirddevice }, { join => { devicetype => 'devices' },result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my $data = [$rs1->union([$rs2, $rs3])->all];
但是,如果我尝试像下面这样处理未知数额,我会得到
Can't call method "result_class" on unblessed reference at /usr/local/share/perl/5.18.2/DBIx/Class/Helper/ResultSet/SetOperations.pm line 63.
当我 运行:
my $data = [$rs1->union([@rslist])->all];
以下是我尝试让它工作的尝试:
#shift off the first device as we still need $rs1
my $firstdevice = shift @{$devices};
my $rs1 = $self->search({ 'devices.devicename' => $firstdevice }, { join => { devicetype => 'devices' }, result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my @rslist;
for my $device (@{$devices}) {
push @rslist, $self->search({ 'devices.devicename' => $device }, { join => { devicetype => 'devices' }, result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
}
my $data = [$rs1->union([@rslist])->all];
当您将 ->search 的 return 值推送到列表上下文的 @rslist 时,搜索不会 return 一个结果集,而是一个结果对象列表,它们是哈希引用,因为HRI result_class。
使用 search_rs 将解决您的问题。
由于 union 采用结果集的 arrayref,我将传递 \@rslist 而不是构建新的 arrayref。
您好,我正在使用 Helper::ResultSet::SetOperations 库来查找某些结果集的并集和交集。如果我知道结果集的数量,那么一切正常,但是我试图让它为未知数量的结果集工作。
处理 3 时以下工作 'devices'
my $firstdevice = shift @{$devices};
my $rs1 = $self->search({ 'devices.devicename' => $firstdevice }, { join => { devicetype => 'devices' }, result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my $seconddevice = shift @{$devices};
my $rs2 = $self->search({ 'devices.devicename' => $seconddevice }, { join => { devicetype => 'devices' },result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my $thirddevice= shift @{$devices};
my $rs3 = $self->search({ 'devices.devicename' => $thirddevice }, { join => { devicetype => 'devices' },result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my $data = [$rs1->union([$rs2, $rs3])->all];
但是,如果我尝试像下面这样处理未知数额,我会得到
Can't call method "result_class" on unblessed reference at /usr/local/share/perl/5.18.2/DBIx/Class/Helper/ResultSet/SetOperations.pm line 63.
当我 运行:
my $data = [$rs1->union([@rslist])->all];
以下是我尝试让它工作的尝试:
#shift off the first device as we still need $rs1
my $firstdevice = shift @{$devices};
my $rs1 = $self->search({ 'devices.devicename' => $firstdevice }, { join => { devicetype => 'devices' }, result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
my @rslist;
for my $device (@{$devices}) {
push @rslist, $self->search({ 'devices.devicename' => $device }, { join => { devicetype => 'devices' }, result_class => 'DBIx::Class::ResultClass::HashRefInflator' } );
}
my $data = [$rs1->union([@rslist])->all];
当您将 ->search 的 return 值推送到列表上下文的 @rslist 时,搜索不会 return 一个结果集,而是一个结果对象列表,它们是哈希引用,因为HRI result_class。 使用 search_rs 将解决您的问题。
由于 union 采用结果集的 arrayref,我将传递 \@rslist 而不是构建新的 arrayref。