ГДЕ Дайте мне разные результаты при запуске в PhpMyAdmin - PullRequest
0 голосов
/ 07 октября 2018

Когда я запускаю следующий запрос в phpMyAdmin

    SELECT 
        locations.name,
        locations.id,
        locations.lon,
        locations.lat,
        locations_categories.category_id as catId,
        locations_categories.location_id as locId,
        haversine(40,90,locations.lon,locations.lat) as distance
    FROM locations_categories, locations  
    WHERE locations.id = locations_categories.location_id
    AND locations_categories.category_id IN ("9","1","7")  
    ORDER BY `distance` ASC

Это дает мне следующие правильные результаты:

enter image description here

Но когда я запускаю следующее в своем приложении Laravel, оно возвращает только местоположения с catId, равным 9.

        // dump($request->categories);
        $categories = implode('","',$request->categories);

        //dd($categories);


        $statement = <<<'ENDSTATEMENT'
        SELECT 
            locations.name,
            locations.id,
            locations.lon,
            locations.lat,
            locations_categories.category_id as catId,
            locations_categories.location_id as locId,
            haversine(?,?,locations.lon,locations.lat) as distance
        FROM locations_categories, locations  
        WHERE locations.id = locations_categories.location_id
        AND locations_categories.category_id IN (?)  
        ORDER BY `distance` ASC
ENDSTATEMENT;

    $locations = DB::select($statement, array($request->lon, $request->lat, $categories));

Результаты

dd($categories);

- это следующий снимок экрана

enter image description here

Мой вопрос: почему это работает и возвращает все значения, необходимые в PhpMyAdmin, но не при запуске в приложении ??

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Ответ на ваш вопрос связан с реализацией связанных переменных в сочетании с приведением типа.

Граница ? заменяется одним значением.Это не простой поиск и замена в операторе SQL.Таким образом, в locations_categories.category_id IN (?) значение ? является буквально целым значением 9","1","7.Но почему это все еще возвращает результаты, где locations_categories.category_id = 9?

Из-за приведения типов.Я предполагаю, что locations_categories.category_id - это числовой, а не столбец символьного типа в вашей схеме.Поэтому, когда выполняется SQL, строковое значение в правой части, 9","1","7, приводится в числовое представление, которое оказывается 9.Вы можете увидеть это более подробно здесь:

mysql> select cast('9","1","7' as signed);
+-----------------------------+
| cast('9","1","7' as signed) |
+-----------------------------+
|                           9 |
+-----------------------------+
1 row in set, 1 warning (0.05 sec)

mysql> show warnings;
+---------+------+------------------------------------------------+
| Level   | Code | Message                                        |
+---------+------+------------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: '9","1","7' |
+---------+------+------------------------------------------------+
1 row in set (0.04 sec)
0 голосов
/ 07 октября 2018

Используйте здесь код Laravel, а не один необработанный запрос.Это позволяет вам воспользоваться функцией whereIn, которая может правильно связать массив значений PHP с выражением WHERE.

$locations = DB::table('locations_categories as lc')
    ->join('locations', 'locations.id', '=', 'lc.location_id')
    ->whereIn('lc.category_id', $request->categories)
    ->selectRaw('locations.name, locations.id, locations.lon, locations.lat,'
        . 'lc.category_id as catId,'
        . 'lc.location_id as locId,'
        . 'haversine(?, ?, locations.lon,locations.lat) as distance',
    [$request->lon, $request->lat])
->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...