0

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

基本上我有3张桌子

订单、订单项和项目。物品是可用的。订单是一个人想要的物品的集合。所以我可以用类似的东西把它们绑在一起

select oi.order_item_id,oi.order_id,i.item_id from orders as o 内部连接 ​​order_items as oi on oi.order_id = o.order_id 内部连接项目 as i on i.item_id = oi.item_id where blah blah blah ....

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

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

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

  • MyApp::Schema::Result::OrderItems->belongs_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);
  }
}

它在内循环上无限循环

4

2 回答 2

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);
  }
}
于 2011-02-15T15:48:36.400 回答
0

在我发现的“下一个”的 ResultSet 文档中更仔细地阅读

“请注意,您需要存储结果集对象,并在其上调用 next。重复调用 resultset('Table')->next 将始终返回结果集中的第一条记录。”

这里

当我将循环更改为

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

一切都很好。

于 2011-02-14T18:27:48.620 回答