所以我有一个变量和一个记录集:
$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.
});
答案 0 :(得分:0)
我认为解决方案是先使用($ filter)
$filteredRecords = $records->first(function($record) use ($firstRecordID){
return ($record->id == $firstRecordID);
});
答案 1 :(得分:-1)
在过滤器内部抛出异常并将其捕获到外部。您可能必须自己收集数组中包含的项目,因为您将无法访问find
的返回值。
你过分关注某种特定的策略(使用过滤器停止find
),这可能会让你退后一步并考虑你想要实现的目标。
老实说听起来你正试图吃掉你的蛋糕并且也是这样:你想要灵活并在一个你可以轻易改变的功能中指定你的搜索条件,但你也想要高效而不是拉出更多的数据你需要的数据库。
问题是,将过滤器函数传递到find
已经低效了,因为在你的过滤器是偶数之前,li3必须从数据库中提取每条记录调用。 这就是效率低下的地方。一旦你点击10个项目或其他任何不会产生太大影响的事情就停止过滤过程(除非你的过滤也非常昂贵)。
我建议考虑以下事项:
你真的需要允许任何过滤方法吗?是否可以使用声明性条件?如果是这样,您可以提供limit
选项并让数据库完成所有工作。
如果不能,请考虑使用find
获取一小批记录并收集要保留在数组中的记录。重复另一个小批处理,直到您检查了数据库中的每个项目或填充了数组。