我无法确定是否有更好的方法来过滤数组集合 。 这是我的代码:
$searchResults = $this->get('app.user.repository')->getUsersBySearchData($searchDetails);
$searchResults->filter(
function($user) use ($searchDetails){
$distance = $this->get('app.distance.calculator')->calculateDistance($user->getCity(), $searchDetails->getCity());
$distanceToTravel = $user->getDistanceToTravel();
if($distance < $distanceToTravel)
return true;
return false;
}
);
这将返回从已获取的集合中过滤掉的$ searchResults中的所有用户。
我需要从数据库中获取所有用户,这些数据库的位置不超出用户在其个人资料中输入的距离以及在搜索表单中输入的城市。要确定是否未超出该距离,我必须计算在搜索表单中输入的位置与用户位置之间的距离,并将该距离与用户配置文件距离进行比较。
是否可以在数据库级别进行此类过滤?我查看了Criteria API,但couuldn没有弄清楚如何做到这一点。
答案 0 :(得分:1)
由于您使用外部模块进行过滤,因此无法进行此操作。您应该以某种方式将过滤移动到数据库级别。由于您需要添加对不同位置的过滤支持,我建议您将这些位置存储在数据库中,以便您可以使用它们进行过滤。简单地添加城市名称将不足以提供信息。
我建议您在数据库中添加城市的经度(location_longitude
)和纬度(location_latitude
),并在SQL查询中使用它进行过滤。
同时检查this question for reference
您还可以在教义内部进行自定义位置映射,以使工作更顺畅。请查看学说文档章节Advanced field value conversion using custom mapping types以获取示例。
此示例解释了DBAL类型a,其中位置(点)存储在数据库中的纬度和经度值中。