【问题标题】:Laravel get database results from user's form input detailsLaravel 从用户的表单输入详细信息中获取数据库结果
【发布时间】:2017-11-24 22:53:16
【问题描述】:

我一直在寻找我正在尝试运行的查询的解决方案。 我有一个名为位置的数据库表,我需要用户能够提交表单来更改/过滤返回的结果。

用户可以选择的 2 个字段是慈善和距离 这些字段不是强制性的,因此需要检查它们是否已设置。

我目前可以使用距离,但是当两者都使用 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 慈善线拿出来,它只适用于距离,但我需要两者

【问题讨论】:

  • 它是否只适用于慈善而不适用于距离?记录查询并手动运行?也许 $charity 没有完全匹配的值。此外,按照您的方式进行操作非常危险,可能会导致 SQL 注入
  • 你有没有考虑过使用 Laravel 查询构建器来简化/调试这个?我建议分解此查询并确定它是 SQL 问题还是 php 变量问题。
  • 另外,不应该是 $request->input('whatever') 而不是 $request->Input(['whatever']) 吗?
  • 是的,它只与慈善机构合作。我尝试使用查询生成器,但无法获得使用它的距离,所以尝试这种方式只是为了查看查询是否正确。

标签: mysql laravel laravel-5 laravel-query-builder


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多