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

时间:2012-05-30 04:38:44

标签: 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'
);

我想根据搜索结果从此子translation返回find_translation的值。我无法为此获得最佳条件。

我尝试将_data复制到数组中,但我不确定如何继续进行。由于_data将是一个空的arrayref和另一个条件,它将在arrayref内部有一个hashref。

my @Arr = $translation_exists_r_not->{'_data'};

2 个答案:

答案 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::DBIperldoc 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;