1

だから私は変数とレコードセットを持っています:

$firstRecordID = 1;
$records = Recordset::all();

レコードセットをフィルター処理したい:

$filteredRecords = $records->find(function($record) use ($firstRecordID){
    return ($record->id == $firstRecordID);
});

この例では、レコード ID が主キーであると仮定すると、返される行は 1 行だけですが、フィルターは継続すると思います。

私の質問は、特定の条件が満たされた後にフィルターを強制的に停止するにはどうすればよいですか?

編集:別のより複雑な例を追加します:

$filteredRecords = $records->find(function($record) use ($lastRecordID){
    $conditions == $records->conditions;
    // in here I would find some value 
    // based on some other unknown record based on the $conditions

    // if the value matches any of the $conditions return the row
    // if the value matches a specified stop condition 
    // (which is defined by the user) stop retrieving rows.
});
4

2 に答える 2

0

解決策はfirst($ filter)を使用することだと思います

$filteredRecords = $records->first(function($record) use ($firstRecordID){
    return ($record->id == $firstRecordID);
});

http://li3.me/docs/lithium/util/Collection :: first

于 2012-02-22T09:35:46.447 に答える
-1

簡潔な答え

フィルター内で例外をスローし、外側でキャッチします。findの戻り値にアクセスできないため、含まれているアイテムを自分で配列に収集する必要があるでしょう。

長い答え

特定の戦術 (フィルターの使用をやめる) に集中しすぎてfindいます。

正直なところ、ケーキを食べようとしているように聞こえます: 簡単に変更できる関数で柔軟に検索条件を指定したいのですが、効率的でデータベースからより多くのデータを引き出したくない場合もあります。あなたがしなければならないよりも。

フィルター関数を に渡すことは、フィルターが呼び出される前にデータベースからすべてのレコードfindをプルする必要があるため、取得できる限り非効率的です。そこが非効率なところです。10 個のアイテムに到達した場合などにフィルタリング プロセスを停止しても、大きな違いはありません (フィルタリングが非常に高価でない限り)。

次のことを考えることをお勧めします。

  1. フィルターメソッドを許可する必要は本当にありますか? 宣言的条件を使用することは可能ですか? その場合は、limitオプションを指定して、データベースにすべての作業を任せることができます。

  2. それができない場合はfind、レコードの小さなバッチをフェッチし、配列に保持したいレコードを収集するために使用することを検討してください。データベース内のすべてのアイテムをチェックするか、配列がいっぱいになるまで、別の小さなバッチで繰り返します。

于 2012-02-23T20:32:29.483 に答える