DBIx :: Класс бесконечных результатов - PullRequest
0 голосов
/ 14 февраля 2011

Прежде чем описать детали, проблема в том, что я запускаю $ c-> model ('ResultName') -> search ({k => v}), и когда я зацикливаюсь на результатах его отношения has_many, естьтолько один в базе данных, но он зацикливается навсегда.Я попробовал поискать в Google и нашел одного человека, который решил проблему, но со слишком кратким объяснением для меня.Его пост был здесь .

В основном у меня есть 3 таблицы

Orders, OrderItems и Items.Предметы - это то, что доступно.Заказы - это коллекции предметов, которые хочет один человек.Таким образом, я могу связать их все вместе с помощью чего-то вроде

select oi.order_item_id, oi.order_id, i.item_id из ордеров как o внутреннее объединениена i.item_id = oi.item_id, где бла-бла-бла ....

Я запустил DBIx :: Class :: Schema :: Loader и получил то, что казалось правильными отношениями

  • MyApp :: Schema :: Result :: Order-> has_many ('order_items' ...)

  • MyApp :: Schema :: Result :: Items-> has_many ('order_items' ...)

  • MyApp :: Schema :: Result :: OrderItems-> Proper_to ('items' ...)

в тесте я пытаюсь

my $orders = $schema->resultset('Order')->search({
 'user_id'=>1
});

while(my $o = $orders->next) {
  while(my $oi = $o->order_items->next) {
    warn('order_item_id: '.$oi->order_item);
  }
}

Он бесконечно зацикливается на внутренней петле

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Ваше решение работает, но оно теряет тонкости next в том, что оно является итератором.Фактически вы загружаете все строки как объекты в память и зацикливаетесь на них.

Проблема, как вы сказали, заключается в том, что $o->order_items->next воссоздает набор результатов order_items каждый раз.Вы должны сделать это:

my $orders = $schema->resultset('Order')->search({
 'user_id'=>1
});

while(my $o = $orders->next) {
  my $oi_rs = $o->order_items;
  while(my $oi = $oi_rs->next) {
    warn('order_item_id: '.$oi->order_item);
  }
}
0 голосов
/ 14 февраля 2011

Читая более осторожно в документации ResultSet для "следующего", я нашел

"Обратите внимание, что вам нужно хранить объект набора результатов и вызовите следующий. Вызов набора результатов («Таблица») -> следующий неоднократно будет всегда возвращать первая запись из набора результатов. "

из здесь

Когда я изменил петли на

for my $o ($orders->all) {
  for my $oi ($o->order_items->all) {
     # stuff
  }
}

все хорошо.

...