내가하려는 것은 간단합니다 : - 사용자 위도와 경도 (DB에서)에 따라 계산 된 거리가 int보다 클 때 우리는 이 어디를 추가하여 결과에서 현재 사용자를 제거 - 그 거리가 높지 않은 경우, 우리는 반환 된 결과에 사용자 정의 값을 추가Laravel QueryBuilder를 사용하여 "when"을 선택하고 쿼리 결과에 사용자 정의 값을 추가하십시오.
쿼리가 실행 된 후이 쉽게 foreach 문을 사용하여 수행 할 수 있습니다:
foreach($search as $key => $value){
if(distance($value->latitude,$value->longitude,$user->latitude,$user->longitude,"K") > $distance) {
unset($search[$key]);
} else {
$search[$key]->distance = $calculatedDistance
}
}
이 방법의 단점은 우리가 큰 데이터베이스를 가지고있는 경우 많은 mem 오라와 시간, 우리가 직접 질문에서 직접해야 할 일을 두 번 수행합니다.
내가 수행해야하는 것은 쿼리 자체에서이 작업을 실행하는 것입니다. 내가 뭘 해야할지 모르겠다 : - 쿼리가 실행될 때 쿼리에 직접 사용자 지정 값을 추가하고 쿼리 내에서 거리 계산을 수행하려면 foreach를 사용하지 않고 현재 원시 값을 직접 가져옵니다. 비교할. 내가 지금 뭘하는지
:
->when($distance > 0, function ($query) use($distance, $longitude, $latitude){
$query->where(function ($subQuery) use ($longitude, $latitude,$distance) {
$cDistance = distance((int)$subQuery->value('latitude'),
(int)$subQuery->value('longitude'),
$latitude,
$longitude,
"K");
$subQuery->when(($cDistance > $distance),
function ($subQuery){
$subQuery->where('users.id', '<>', (int)$subQuery->value('id'));
},function ($subQuery) use ($cDistance) {
$subQuery->value((string)$cDistance.' as distance');
}
);
});
$subQuery->value('something')
는 조회의 첫 번째 원료와 테스트, 모든 행에 대해이 작업을 수행하지 않습니다. 필드리스트 '에서' 84 0.354917445764 1054 알 컬럼 (SQL : 84
을 선택 354917445764
distance
1 제한 users
에서 한다.)
$subQuery->value((string)$cDistance.' as distance');
오류를
SQLSTATE [42S22]를 반환 쿼리 내부
** -> value ($ column_name) ** ** ** $ column_name **의 값만 가져옵니다. 메서드 내용을 붙여 넣어 – MohamedSabil83
메서드 내용을 붙여 넣으시겠습니까? 필요한 것은 $ user = [username => myname]과 같은 쿼리 결과에 값을 추가하는 것입니다. 결과가 $ user = [username => myname, age = 5]가되도록 5 세를 추가해야합니다. –
알아요. 메서드에 의해'-> when()'함수 – MohamedSabil83