2015-10-13 3 views
0

Я новичок в Perl и DBIx :: Class.Perl DBIx :: Класс встречается Объект Json

Это, как я получаю мой 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)

Но если я это сделать Лик 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->meaning является экземпляром TranslationDB::Schema::Result::Language. Это explained in DBIx::Class::Manual::ResultClass on CPAN.

Я считаю, что существует связь с таблицей meaning, а когда вы вызываете $translation->meaning, то, что вы получаете, - это новый класс результатов. Вместо этого вам нужно позвонить $translation->meaning_id. На самом деле это произойдет только в join, но ваш код не похож на это.

+1

Я мог бы получить правильное значение смысл_id с помощью $ translation-> mean-> mean_id – Hansanho

+0

Спасибо за помощь и редактирование моего сообщения :) хорошо провести день – Hansanho

3

Кажется $translation->meaning возвращает объект. Использование 0+ просто возвращает свой адрес (поэтому цифры настолько высоки).

1

Похоже, что есть отношения между вашими таблицами перевода и значения. Вероятно, таблица перевода содержит внешний ключ в таблице значений. Если вы посмотрите в классе Result для вашего класса трансляции, вы увидите, что это соотношение определено - оно будет называться «значением».

Поскольку у вас есть эти отношения, DBIC добавила к вашему классу метод meaning, который извлекает объект значения, связанный с вашим переводом.

Но, похоже, что столбец внешнего ключа в вашей таблице переводов также называется «значением», поэтому вы ожидаете, что вызов метода «значение» дает вам значение внешнего ключа, а не связанного с ним объекта. К сожалению, это не так. Метод отношений переопределяет метод столбцов.

Это результат плохой практики именования. Я рекомендую вызывать первичный ключ для каждой таблицы id и внешний ключ, который ссылается на другую таблицу <table_name>_id - поэтому столбец в вашей таблице переводов будет называться meaning_id. Таким образом, вы можете различать значение ключа ($translation->meaning_id) и связанного с ним объекта значения ($translation->meaning).

Обходной способ использования, если вы не можете переименовать столбцы, заключается в использовании метода get_column - $translation->get_column('meaning').

+0

Thanks mate! Хорошее объяснение! Помог мне понять, почему это произошло! Я не создал эту базу данных, но если я ее создам, я буду помнить, что вы упомянули! – Hansanho