2011-02-14 60 views
0

在我描述的細節,問題是,我運行一個$ C->模型(「ResultName」) - 對結果>搜索({K => V}),當我環它的has_many關係,數據庫中只有一個,但它永遠循環。我試過Google搜索,發現一個人解決了這個問題,但對我來說太簡單了。他的帖子是hereDBIx ::類無窮結果

基本上我有3個表

訂單,訂單項目和項目。項目是可用的。訂單是一個人想要的物品的集合。因此,我可以將它們全部綁在一起,如

從訂單中選擇oi.order_item_id,oi.order_id,i.item_id作爲內部連接order_items作爲oi on oi.order_id = o.order_id內部連接項目作爲i在i上.item_id = oi.item_id哪裏等等等等等等....

我跑DBIx ::類::模式:: Loader和得到了什麼似乎是適當的關係

  • MyApp的::模式::結果::訂單 - > has_many('order_items'...)

  • MyApp :: Schema :: Resul噸::項 - >的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); 
    } 
} 

它無限循環的內部循環

回答

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); 
    } 
} 
+0

會做,謝謝! – Felix 2011-02-15 22:17:44

0

在ResultSet documentati更carfully閱讀我找到了

「請注意,您需要存儲 結果集對象,然後調用next對象。 調用結果集( '表') - >下一步 反覆將始終從結果從here

返回 第一條記錄「

當我改變了循環來

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

。一切都很好