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' );

そのようなシナリオの 1 つで、テーブルに行が存在するかどうかを確認することになっています。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空の配列参照と別の条件になるため、配列参照内にハッシュ参照が含まれます。

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

2 に答える 2

2

search基準によっては複数の行が返される可能性があるため、CDBI のメソッドはイテレータを返します。

条件に一致する行が 1 つしかないことがわかっている場合は、次の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 には優れたドキュメントがあります。

于 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];
}

それが1つであるかどうかを確認します。

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 に答える