【问题标题】:DBIx::Class infinite resultsDBIx::Class 无限结果
【发布时间】:2011-06-27 01:07:02
【问题描述】:

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

基本上我有3张桌子

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

从订单中选择 oi.order_item_id,oi.order_id,i.item_id 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);
  }
}

在内循环上无限循环

【问题讨论】:

    标签: perl catalyst dbix-class


    【解决方案1】:

    在我找到的“下一个”的 ResultSet 文档中仔细阅读

    "请注意,您需要存储 结果集对象,然后调用它。 调用 resultset('Table')->next 反复将始终返回 结果集中的第一条记录。”

    来自here

    当我将循环更改为

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

    一切都好。

    【讨论】:

      【解决方案2】:

      您的解决方案有效,但它失去了 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-07-19
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2014-03-30
        • 1970-01-01
        • 2011-07-09
        • 2016-08-25
        • 2011-12-24
        相关资源
        最近更新 更多