0

詳細を説明する前に、問題は、$c->model('ResultName')->search({k=>v}) を実行し、その has_many リレーションの結果をループすると、1 つしかないことです。データベースですが、永遠にループします。グーグルを試してみたところ、問題を解決した人が1人見つかりましたが、説明が短すぎました。彼のポストはここにありました。

基本的に私は3つのテーブルを持っています

Orders、OrderItems、Items。アイテムは利用可能なものです。注文は、1 人の人が欲しいアイテムのコレクションです。だから私はそれらすべてを次のようなもので結び付けることができます

注文から oi.order_item_id,oi.order_id,i.item_id を o として選択します。

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しますが、イテレータであるという点で優れていません。実際には、すべての行をオブジェクトとしてメモリにロードし、それらをループしています。

あなたが言ったように、問題は毎回order_items$o->order_items->next結果セットを再作成することです。これを行う必要があります:

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 に答える