DBIx :: Class无限结果

时间:2011-02-14 16:28:41

标签: perl catalyst dbix-class

在我描述细节之前,问题是,我运行$ c->模型('ResultName') - >搜索({k => v})并且当我循环结果时它的has_many关系,数据库中只有一个,但它永远循环。我试过谷歌搜索,发现一个人解决了这个问题,但对我的解释太简短了。他的帖子是here

基本上我有3张桌子

订单,订单商品和商品。物品是可用的。订单是一个人想要的物品的集合。所以我可以将它们与

之类的东西捆绑在一起

选择oi.order_item_id,oi.order_id,i.item_id从订单作为o inner join order_items as oi on oi.order_id = o.order_id inner join items as i on i.item_id = oi.item_id where blah blah blah。 ...

我运行了DBIx :: Class :: Schema :: Loader并获得了似乎正确的关系

  • MyApp的::架构::结果::命令中─>的has_many( 'ORDER_ITEMS' ...)

  • MyApp的::架构::结果::项 - >的has_many( 'ORDER_ITEMS' ...)

  • MyApp的::架构::结果:: OrderItems-> belongs_to的( '项目' ...)

测试 中我尝试

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 个答案:

答案 0 :(得分:3)

你的解决方案有效,但它失去了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);
  }
}

答案 1 :(得分:0)

在ResultSet文档中更仔细地阅读“next”,我找到了

  

“请注意,您需要存储   结果集对象,并在其上调用next。   调用结果集('表') - >接下来   反复总是会回来的   结果集中的第一条记录。“

来自here

当我将循环更改为

for my $o ($orders->all) {
  for my $oi ($o->order_items->all) {
     # stuff
  }
}
一切都很顺利。