Я использую Laravel 5 и столкнулся с трудной проблемой, связанной с выбором радиуса и почтового индекса.
У меня есть модель отеля и большая база отелей. Каждый отель в моей базе данных имеет широту / долготу, а также радиус (в милях) того, как далеко они принимают клиентов. Большинство этих отелей имеют радиус 50, но некоторые выше или ниже.
Пользователи на моем сайте вводят почтовый индекс для своего поиска. Я использую этот почтовый индекс, чтобы вернуть лат / лнг, а затем запрашиваю все отели в пределах X миль от них. Я в настоящее время использую этот код:
$lat = '123'; // geocoded from user entered zip
$lng = '123'; // geocoded from user entered zip
$radius = '50'; // currently, hardcoded, need to change
$hotels = Hotel::select(
\DB::raw("*,
( 3959 * acos( cos( radians(" . $lat . ") ) *
cos( radians( lat ) )
* cos( radians( lng ) - radians(" . $lng . ")
) + sin( radians(" . $lat . ") ) *
sin( radians( lat ) ) )
) AS distance"))
->having("distance", "<", $radius)
->orderBy("distance")
->get();
Как вы можете видеть выше, в настоящее время я жестко кодирую «50» как радиус, но на самом деле мне нужно использовать столбец «радиус» в таблице отелей.
Каков наилучший способ сделать это?
Вам просто нужно сравнить рассчитанное расстояние с числом в столбце радиуса (или с тем, что вы называете столбцом радиуса в таблице отелей).
Попробуйте поменять свой having
пункт с этим havingRaw
, Вам нужно будет изменить radius
к названию столбца в вашей таблице, где хранится радиус отеля. Вероятно, также лучше использовать меньше или равно.
->havingRaw("distance <= radius")
Других решений пока нет …