2016-09-16 5 views
0

배열 컬렉션을 필터링하는 더 좋은 방법이 있는지 알아 내는데 어려움이 있습니다. . 이 내 코드입니다 :사전 계산을 통한 교리 필터링

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

이 $에서 모든 사용자가 이미 인출 모음에서 필터링의 SearchResult를 반환합니다.

사용자가 자신의 프로필에 입력 한 거리와 검색 양식에 입력 된 도시가 아닌 모든 사용자 양식 데이터베이스를 가져와야합니다. 거리가 초과되지 않았는지 확인하려면 검색 양식에 입력 된 위치와 사용자 위치 사이의 거리를 계산하고 그 거리를 사용자 프로필 거리와 비교해야합니다.

데이터베이스 수준에서 이러한 종류의 필터링을 수행 할 수 있습니까? 기준 API를 살펴 보았지만이를 수행하는 방법을 알지 못했습니다.

답변

1

필터링을 위해 외부 모듈을 사용 했으므로 사용할 수 없습니다. 어떻게 든 데이터베이스 수준으로 필터링을 이동할 수 있어야합니다. 다른 위치에 필터링에 대한 지원을 추가해야하므로 필터링에 사용할 수있는 방식으로 데이터베이스에 위치를 저장하는 것이 좋습니다. 도시의 이름을 추가하기 만하면 정보가 충분하지 않습니다.

데이터베이스에 도시의 경도 (location_longitude)와 위도 (location_latitude)를 추가하고이를 SQL 쿼리에서 필터링에 사용하는 것이 좋습니다.

또한 상황이 조금 부드럽게 작동 만들기위한 교리 안에 사용자 정의 위치 매핑을 만들 수도 this question for reference


확인합니다. 예를 들어 교리 문서 장 Advanced field value conversion using custom mapping types을 확인하십시오.

이 예제는 위치 (지점)가 데이터베이스의 위도 및 경도 값에 저장되는 DBAL 유형을 설명합니다.

+0

도움 주셔서 감사합니다. 나는 더 나은 설명을 위해 질문을 편집했다. 제안 사항이 계속 적용되는지 확인하십시오. – 3ND

+0

예 제안이 여전히 적용됩니다. 조금만 제 질문을 업데이트했습니다. '경도'와 '위도'열을 표에 추가하면 거리로 검색 할 수 있습니다. 당신이 어떻게 할 수 있는지에 대한 예제는 내 답변의 링크를 참조하십시오. – Wilt

+0

할거야. 고마워. – 3ND