在我描述细节之前,问题是,我运行$ 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);
}
}
它在内环上无限循环
答案 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
}
}
一切都很顺利。