Как не использовать БД в следующем запросе, имеющем подзапрос - PullRequest
0 голосов
/ 18 мая 2018

У меня есть следующая функция для вычисления расстояний между двумя точками по формуле Хаверсайна:

public static function getByDistance($distance)
{
    $pubsFiltered = DB::select(
        'SELECT * FROM
                (SELECT *, (6371 * acos(cos(radians(40.4169473)) * cos(radians(latitude)) *
                cos(radians(longitude) - radians(-3.7035285)) +
                sin(radians(40.4169473)) * sin(radians(latitude))))
                AS distance
                FROM pubs) AS distances
            WHERE distance < ' . $distance . '
            ORDER BY distance
            ;
        ');

    return $pubsFiltered;
}

Это возвращает массив вместо коллекции, это то, что мне нужно.

Если я изменяю DB на Pub, он возвращает ошибку из-за подзапроса, в котором я вычисляю «расстояние», используя мою таблицу «pubs».

Как мне изменить всю функцию или просто подзапрос, чтобы получить экземплярмоя модель Pub? ... Должен ли я использовать переменные set / объявление в mysql?

Большое спасибо !!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Сейчас я использую этот запрос для получения ближайших записей:

public function scopeNearby($query, $lat, $long, $distance = 10)
{
    if($lat AND $long) {
        // 3959 for miles, 6371 for kilometers
        $distanceQuery = '(6371 * acos(cos(radians(?)) * cos(radians(geo_lat)) * ' . 
            'cos(radians(geo_long) - radians(?)) + sin(radians(?)) ' .
            '* sin(radians(geo_lat))))';

        return $query->select('*', DB::raw("{$distanceQuery} as distance"))
                ->addBinding([$lat, $long, $lat], "select")
                ->whereNotNull('geo_lat')
                ->whereNotNull('geo_long')
                ->whereRaw("{$distanceQuery} < ?")
                ->addBinding([$lat, $long, $lat, $distance], "where")
                ->orderBy('distance', "ASC");
    }
}

Вы можете заметить, что я использовал $distanceQuery как для предложений SELECT, так и WHERE.В настоящее время у меня возникают проблемы, когда эта область используется вместе с методом paginate().Это может потребовать некоторого рефакторинга, но сейчас вы можете сделать то же самое.

0 голосов
/ 18 мая 2018

$pubs = Pubs::hydrate($pubsFiltered)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...