Laravel получает результаты базы данных из данных ввода пользовательской формы

Я искал решение для запроса, который я пытаюсь запустить. У меня есть таблица базы данных, называемая местоположениями, и мне нужно, чтобы пользователь мог отправить форму для изменения/фильтрации возвращаемых результатов.

Пользователь может выбрать два поля: благотворительность и расстояние. Эти поля не являются обязательными, поэтому необходимо проверить, заданы ли они.

В настоящее время я работаю с расстоянием, но не могу заставить его работать, когда оба заполнены с помощью AND WHERE

вот моя функция контроллера

public function search(Request $request)
    {
        $circle_radius = 3959;
        $max_distance = $request->Input(['distance']);
        $charity = $request->Input(['charities']);
        $lat = '53.5526';
        $lng = '-1.479726';

        $locations = DB::select(
            'SELECT * FROM
                (SELECT *, (' . $circle_radius . ' * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) *
                cos(radians(longitude) - radians(' . $lng . ')) +
                sin(radians(' . $lat . ')) * sin(radians(latitude))))
                AS distance
                FROM locations) AS distances
            WHERE distance < ' . $max_distance . '
            AND charity = ' . $charity . '
            ORDER BY distance;
            ');

        return view('map.search', compact('locations'));

    }

Если я возьму благотворительную линию AND, она работает только с расстоянием, но мне нужно и то, и другое.


person CIB    schedule 24.11.2017    source источник
comment
Это работает только с благотворительностью, а не на расстоянии? Зарегистрировать запрос и запустить его вручную? возможно, $charity не имеет точного соответствия. Кроме того, делать это так, как вы, очень опасно, подвергая риску SQL-инъекции.   -  person Chris Phillips    schedule 25.11.2017
comment
Рассматривали ли вы возможность использования построителя запросов Laravel для упрощения/отладки этого? Я предлагаю разбить этот запрос и определить, является ли это проблемой SQL или проблемой переменной php.   -  person Matt McAlister    schedule 25.11.2017
comment
Кроме того, не должно ли это быть $request-›input('whatever'), а не $request-›Input(['whatever']) ?   -  person Matt McAlister    schedule 25.11.2017
comment
Да, это работает только с благотворительностью. Я попытался использовать построитель запросов, но не смог заставить расстояние работать с ним, поэтому попробовал этот способ, просто чтобы увидеть, правильный ли запрос.   -  person CIB    schedule 25.11.2017


Ответы (1)


Получил мой запрос, выполнив следующие действия. Если кто-то знает лучшее решение, это было бы хорошо.

$max_distance = $request->input('distance');
        $charity = $request->input('charities');
        $lat = '53.5526';
        $lng = '-1.479726';

        $locations = Location::select('locations.*')
                    ->selectRaw('( 3959 * acos( cos( radians(?) ) *
                                       cos( radians( latitude ) )
                                       * cos( radians( longitude ) - radians(?)
                                       ) + sin( radians(?) ) *
                                       sin( radians( latitude ) ) )
                                     ) AS distance', [$lat, $lng, $lat])
                    ->havingRaw("distance < ?", [$max_distance])
                    ->where('charity', '=', $charity)
                    ->get();
person CIB    schedule 25.11.2017