Cập nhật
Nếu bạn sử dụng paginate()
với truy vấn của bạn, laravel sẽ cố gắng thực thi mã SQL sau để đếm tổng số kết quả phù hợp có thể có:
select count(*) as aggregate
from `vehicles` inner join `dealers`
on `vehicles`.`dealer_id` = `dealers`.`id`
having distance < 200
Như bạn thấy, không có cột hoặc bí danh nào như vậy distance
trong truy vấn này.
Tùy chọn 2 trong câu trả lời ban đầu của tôi cũng sẽ giải quyết vấn đề đó.
Câu trả lời ban đầu
Đó là một vấn đề ở chế độ nghiêm ngặt của MySQL. Nếu bạn sử dụng laravel 5.3 chế độ nghiêm ngặt được bật theo mặc định. Bạn có hai lựa chọn:
Tùy chọn 1:Tắt chế độ nghiêm ngặt cho MySQL trong config/database.php
...
'mysql' => [
...
'strict' => false,
...
],
...
Tùy chọn 2:Sử dụng phân vùng WHERE
Vehicle::join('dealers', 'vehicles.dealer_id', '=', 'dealers.id')
->select(DB::raw("dealers.id, ( cos( radians(latitude) ) * cos( radians( longitude ) ) ) AS distance"))
->whereRaw('cos( radians(latitude) ) * cos( radians( longitude ) ) < 200');
Tài liệu:
Chế độ SQL máy chủ - ONLY_FULL_GROUP_BY