我正在使用DB::CDBI
类来访问我们的应用程序中的数据库。我们的项目是面向对象的Perl。
package LT::LanguageImport;
use strict;
use warnings;
use base 'Misk5::CDBI';
__PACKAGE__->table( 'english_text_translation' );
__PACKAGE__->columns( Primary => qw/english language translation/ );
__PACKAGE__->columns( Essential => qw/english language translation/ );
__PACKAGE__->has_a( english => 'LT::EnglishLanguage' );
在一个这样的场景中,我应该检查表中是否存在行。我在CDBI电话中使用了内置搜索API。
sub find_translation {
my $translation_exists_r_not = $class->search(
english => $english,
language => $language,
translation => $translation
);
return;
}
$translation_exists_r_not
根据搜索中给出的输入获得预期值。如果该行存在,则使用行详细信息更新_data
。
$translation_exists_r_not = bless({
'_data' => [
{
'language' => 'polish',
'translation' => 'Admin',
'english' => 'admin'
}
],
'_place' => 0,
'_mapper' => [],
'_class' => 'LT::LanguageImport'
},
'Class::DBI::Iterator'
);
如果该行不存在,那么我得到这样的返回值。
$translation_exists_r_not = bless({
'_data' => [],
'_place' => 0,
'_mapper' => [],
'_class' => 'LT::LanguageImport'
},
'Class::DBI::Iterator'
);
我想根据搜索结果从此子translation
返回find_translation
的值。我无法为此获得最佳条件。
我尝试将_data
复制到数组中,但我不确定如何继续进行。由于_data
将是一个空的arrayref和另一个条件,它将在arrayref内部有一个hashref。
my @Arr = $translation_exists_r_not->{'_data'};
答案 0 :(得分:2)
CDBI的search
方法将返回一个迭代器,因为根据您的条件可能会返回多行。
如果您知道只有一行符合您的条件,您需要使用retrieve
方法,即:
if (my $translation_exists_r_not = $class->retrieve(
english => $english,
language => $language,
translation => $translation
)){
return [$translation_exists_r_not->translation,
'Misk5::TranslationAlreadyExists']
}
else {
return [ '', undef ]
}
如果您的搜索可以返回多行,并且您只对真实性感兴趣,那么请不要在CDBI :: Iterator内部进行搜索,而是使用其方法:
my $translation_exists_r_not = $class->search(
english => $english,
language => $language,
translation => $translation
); # returns an iterator
if ($translation_exists_r_not){
my $first = $translation_exists_r_not->first;
return [ $first->translation, 'Misk5::TranslationAlreadyExists' ]
}
查看perldoc Class::DBI
和perldoc Class::DBI::Iterator
。 CDBI有很好的文档。
答案 1 :(得分:0)
我想我得到了解决方案。感谢无论谁试图解决它。
my @req_array = %$translation_exists_r_not->{_data};
my $length_of_data = '9';
foreach my $elem (@req_array) {
$length_of_data = @{$elem};
}
现在检查数组的长度。
if ($length_of_data == 0) {
$error = '';
$result = [undef, $error];
}
现在检查它是否是一个。
if ($length_of_data == 1) {
my @result_array = @{%$translation_exists_r_not->{_data}};
my $translation = $result_array[0]{'translation'};
$error = 'Misk5::TranslationAlreadyExists';
$result = [$translation, $error];
}
return @$result;