2

我正在使用一个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从这个 sub返回值。find_translation我无法为此获得最佳状态。

我尝试将其复制_data到一个数组中,但我不确定如何进一步进行。就像_data一个空的arrayref和另一个条件一样,它在arrayref内会有一个hashref。

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

2 回答 2

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' ]
}

Have a look at perldoc Class::DBI and perldoc Class::DBI::Iterator. CDBI has excellent documentation.

于 2012-05-30T07:15:19.267 回答
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;
于 2012-05-30T06:47:03.223 回答