2015-10-13 66 views
0

我是新來的Perl和DBIx :: Class。Perl DBIx :: Class遭遇對象Json

這是我如何得到我的meaning_ids從表翻譯其中language = 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)

但如果我這樣做LIK e表示:

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

$self->body(encode_json $data); 

我再也沒有看到錯誤,但含義並不是數據庫中的數字。它太大了(像17789000,但只有號碼,直到7000是有效的)。

有沒有簡單的方法告訴Perl meaning_id是一個INT而不是一個字符串?

回答

3

不知道您的架構類有點難,但@choroba is right。錯誤消息說$translation->meaningTranslationDB::Schema::Result::Language的一個實例。那是explained in DBIx::Class::Manual::ResultClass on CPAN

我相信有一個關係表meaning,當你打電話$translation->meaning你得到的是一個新的結果類。相反,您需要撥打$translation->meaning_id。實際上,這隻會發生在join,但你的代碼看起來不是這樣。

+1

我可以通過$ translation-> meaning-> meaning_id得到正確的意義_id – Hansanho

+0

感謝您的幫助和編輯我的文章:)祝您有美好的一天 – Hansanho

3

看來$translation->meaning返回一個對象。使用0+只是返回它的地址(這就是爲什麼數字如此之高)。

1

看起來你的翻譯和意義表之間有關係。翻譯表可能包含意義表的外鍵。如果你在結果類中查找翻譯類,那麼你會看到定義的關係 - 它將被稱爲「含義」。

如果您有這種關係,那麼DBIC已經爲您的課程添加了meaning方法,該方法將檢索與您的翻譯相關聯的含義對象。

但您的翻譯表中的外鍵列看起來也被稱爲「意義」,所以您期望調用「意義」方法可爲您提供外鍵的值而不是關聯的對象。不幸的是,它不能這樣工作。關係方法重寫列方法。

這是錯誤的命名實踐的結果。我建議您爲每個表id和鏈接到另一個表<table_name>_id的外鍵調用主鍵 - 因此,翻譯表中的列將被稱爲meaning_id。這樣您就可以區分鍵值($translation->meaning_id)和關聯的含義對象($translation->meaning)。

如果無法重命名列,則可以使用解決方法,即使用get_column方法 - $translation->get_column('meaning')

+0

謝謝mate!很好的解釋!幫助我理解爲什麼發生這種事!我沒有創建這個數據庫,但如果我將創建一個我會記住你提到的! – Hansanho

相關問題