Laravel 5.6 - БД select Вызов функции-члена join () для массива - PullRequest
0 голосов
/ 10 июня 2018

У меня следующий запрос:

$clinics =  \DB::select('SELECT * FROM
(SELECT *,
 (100 * acos(cos(radians(' . $lat . ')) * cos(radians(lat)) *
 cos(radians(lng) - radians(' . $lng . ')) +
 sin(radians(' . $lat . ')) * sin(radians(lat))))
 AS distance
 FROM clinics) AS distances
 WHERE distance < 100
 ORDER BY distance')
 ->join('countries', 'clinics.country_id', '=', 'countries.id');

Когда я его запускаю, я получаю следующую ошибку:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
Call to a member function join() on array

Можно ли выполнить JOIN с этимзапрос?Я попытался добавить JOIN в запросе выбора, но получаю сообщение об ошибке:

Column not found: 1054 Unknown column 'clinics.country_id' in 'on clause' (SQL: SELECT * FROM (SELECT *, (100 * acos(cos(radians(43.1557012)) * cos(radians(lat)) * cos(radians(lng) - radians(22.5856811)) + sin(radians(43.1557012)) * sin(radians(lat)))) AS distance FROM clinics) AS distances JOIN countries ON countries.id = clinics.country_id WHERE distance < 100 ORDER BY distance)

Запрос:

$clinics =  \DB::select('SELECT * FROM
    (SELECT *,
     (100 * acos(cos(radians(' . $lat . ')) * cos(radians(lat)) *
     cos(radians(lng) - radians(' . $lng . ')) +
     sin(radians(' . $lat . ')) * sin(radians(lat))))
     AS distance
     FROM clinics) AS distances
     JOIN countries ON countries.id = clinics.country_id
     WHERE distance < 100
     ORDER BY distance');

1 Ответ

0 голосов
/ 10 июня 2018

Из того, что я вижу, подзапрос не нужен, и вы можете преобразовать запрос в нотацию Laravel следующим образом:

$clinics = Clinic::join('countries', 'countries.id', '=', 'clinics.country_id')
    ->selectRaw('clinics.*, countries.*, (
        100 * acos(
            cos(radians(?)) *
            cos(radians(lat)) *
            cos(radians(lng) - radians(?)) +
            sin(radians(?)) * sin(radians(lat))
        )
    ) as distance', [$lat, $lng, $lat])
    ->having('distance', '<', 100)
    ->orderBy('distance')
    ->get();

Возможно, вы захотите явно указать, какие столбцы вы хотите выбрать изcountries table, потому что с countries.* вы переопределите, например, столбец id вашей таблицы clinics.Я добавил countries.*, потому что, думаю, это то, что вы хотели сделать после объединения таблиц.

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