Perl DBIx::Class 遇到对象 Json

Perl DBIx::Class encounterd Object Json

我是 Perl 新手 DBIx::Class。

这就是我如何从 table 翻译中得到我的 meaning_ids 其中语言 = 5:

my $translations = $schema -> resultset('Translation')->search({ language => '5'});

之后,我试图将我的数据从数据库推送到我的数组数据中:

while ( my $translation =$translations->next ) {
   push  @{ $data }, {
     meaning_id =>  $translation-> meaning 
   };
}

$self->body(encode_json $data ); 

如果我这样做,我会收到以下错误:

encountered object 'TranslationDB::Schema::Result::Language=HASH(0x9707158)', but neither allow_blessed , convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing)

但如果我那样做:

while ( my $translation =$translations->next ) {
   push  @{ $data }, {
     meaning_id => 0+ $translation-> meaning 
   };
}

$self->body(encode_json $data ); 

我没有再得到错误,但意思不是数据库中的数字。它太大了(类似于 17789000,但只有 7000 之前的数字有效)。

有没有简单的方法告诉 Perl meaning_id 是一个 INT 而不是一个字符串?

好像$translation->meaningreturns一个对象。使用 0+ 只是 returns 它的地址(这就是数字如此之高的原因)。

不知道你的模式有点困难 classes,但是 . The error message says $translation->meaning is an instance of TranslationDB::Schema::Result::Language. That's explained in DBIx::Class::Manual::ResultClass on CPAN.

我相信与名为 meaning 的 table 有关系,当您调用 $translation->meaning 时,您得到的是一个新结果 class。相反,您需要调用 $translation->meaning_id。实际上,这只会发生在 join 中,但您的代码看起来不像那样。

看起来你的翻译和意思 table 之间有关系。翻译 table 可能包含指向意思 table 的外键。如果您在结果 class 中查看您的翻译 class,那么您将看到已定义的关系 - 它将被称为 "meaning".

由于您有这种关系,DBIC 已向您的 class 添加了一个 meaning 方法,用于检索与您的翻译相关联的意义对象。

但是你的翻译table中的外键列似乎也被称为"meaning",所以你期望调用"meaning"方法给你外键的值而不是比关联的对象。不幸的是,它不是那样工作的。关系方法覆盖列方法。

这是不良命名习惯的结果。我建议您为每个 table id 调用主键和链接到另一个 table <table_name>_id 的外键 - 所以您翻译中的列 table将被称为 meaning_id。这样你就可以区分键的值($translation->meaning_id)和关联的意义对象($translation->meaning)。

如果您无法重命名列,可以使用的解决方法是使用 get_column 方法 - $translation->get_column('meaning').