我正在使用 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'
);
我想根据搜索结果从该子 find_translation
返回 translation
的值。我无法为此获得最佳条件。
我尝试将 _data
复制到数组中,但我不确定如何进一步进行。由于 _data
将是一个空 arrayref,并且另一个条件是 arrayref 内将有一个 hashref。
my @Arr = $translation_exists_r_not->{'_data'};
最佳答案
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 拥有优秀的文档。
关于perl - 如何从 CDBI::Search 函数访问特定的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810061/