如何阻止过滤器继续记录集或集合

时间:2012-02-22 07:33:48

标签: php lithium

所以我有一个变量和一个记录集:

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

我想过滤记录集:

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

在这个例子中,假设记录id是主键,只会返回一行,但是,我认为过滤器会继续运行。

我的问题是,如何在满足某个条件后强制过滤器停止?

编辑:我将添加另一个更复杂的例子:

$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.
});

2 个答案:

答案 0 :(得分:0)

我认为解决方案是先使用($ filter)

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

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

答案 1 :(得分:-1)

简短回答

在过滤器内部抛出异常并将其捕获到外部。您可能必须自己收集数组中包含的项目,因为您将无法访问find的返回值。

长答案

你过分关注某种特定的策略(使用过滤器停止find),这可能会让你退后一步并考虑你想要实现的目标。

老实说听起来你正试图吃掉你的蛋糕并且也是这样:你想要灵活并在一个你可以轻易改变的功能中指定你的搜索条件,但你也想要高效而不是拉出更多的数据你需要的数据库。

问题是,将过滤器函数传递到find已经低效了,因为在你的过滤器是偶数之前,li3必须从数据库中提取每条记录调用。 这就是效率低下的地方。一旦你点击10个项目或其他任何不会产生太大影响的事情就停止过滤过程(除非你的过滤也非常昂贵)。

我建议考虑以下事项:

  1. 你真的需要允许任何过滤方法吗?是否可以使用声明性条件?如果是这样,您可以提供limit选项并让数据库完成所有工作。

  2. 如果不能,请考虑使用find获取一小批记录并收集要保留在数组中的记录。重复另一个小批处理,直到您检查了数据库中的每个项目或填充了数组。