【问题标题】:Perl DBIx::Class encounterd Object JsonPerl DBIx::Class 遇到 Object Json
【发布时间】:2015-10-13 14:56:36
【问题描述】:

我是 Perl 和 DBIx::Class 的新手。

这就是我从语言 = 5 的表翻译中获得meaning_ids 的方式:

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

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

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

$self->body(encode_json $data ); 

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

遇到的对象 'TranslationDB::Schema::Result::Language=HASH(0x9707158)',但两者都不是 allow_blessed 、 convert_blessed 和 allow_tags 设置已启用 (或缺少 TO_JSON/FREEZE 方法)

但如果我这样做:

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

$self->body(encode_json $data ); 

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

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

【问题讨论】:

    标签: json perl dbix-class


    【解决方案1】:

    不知道你的架构类有点难,但是@choroba is right。错误消息显示$translation->meaningTranslationDB::Schema::Result::Language 的一个实例。那是explained in DBIx::Class::Manual::ResultClass on CPAN

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

    【讨论】:

    • 我可以使用 $translation->meaning->meaning_id 得到正确的meaning_id
    • 感谢您的帮助和编辑我的帖子 :) 祝您有美好的一天
    【解决方案2】:

    $translation->meaning 似乎返回了一个对象。使用0+ 只会返回它的地址(这就是数字如此之高的原因)。

    【讨论】:

      【解决方案3】:

      您的翻译表和含义表之间似乎存在某种关系。翻译表可能包含意义表的外键。如果您在 Result 类中查找您的翻译类,那么您将看到定义的关系 - 它将被称为“意义”。

      当您有这种关系时,DBIC 已向您的类添加了一个 meaning 方法,该方法检索与您的翻译相关联的含义对象。

      但是看起来翻译表中的外键列也称为“含义”,因此您希望调用“含义”方法为您提供外键的值而不是关联的对象。不幸的是,它不是那样工作的。关系方法覆盖列方法。

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

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

      【讨论】:

      • 谢谢伙计!很好的解释!帮助我理解为什么会这样!我没有创建这个数据库,但如果我要创建一个,我会记住你提到的!
      猜你喜欢
      • 2016-08-25
      • 2018-01-09
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多