perl - 如何从 CDBI::Search 函数访问特定的返回值?

标签 perl class-dbi

我正在使用 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::DBIperldoc Class::DBI::Iterator 。 CDBI 拥有优秀的文档。

关于perl - 如何从 CDBI::Search 函数访问特定的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810061/

相关文章:

linux - 在 Debian 和 CentOS 上安装 Perl 时出现 Makefile.PL 错误

regex - 找到一个作为模式给出的行词另一个行词,awk,perl,sed,grep?

perl - 能否获取Class::DBI生成的SQL语句?

perl - 如何清除 Class::DBI 的内部缓存?

perl - 如何使用 Class::DBI 将二进制数据插入到 BLOB 列中?

perl - 如何获取已安装 Perl 模块的版本和位置?

xml - 如何在perl中获取xml元素的第一个和最后一个子元素

perl - 如何拦截 perl Test::More 的 BAIL_OUT() 并继续下一个测试?

perl - 我如何在 Class::DBI 中使用 add_to?