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->meaning
returns一个对象。使用 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')
.
我是 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->meaning
returns一个对象。使用 0+
只是 returns 它的地址(这就是数字如此之高的原因)。
不知道你的模式有点困难 classes,但是 $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')
.