口语查询,其中“任何值”

问题描述 投票:0回答:3

这里,我试图在具有多个参数的控制器中编写通用搜索查询,但是该请求可能没有该请求的所有参数。有没有一种方法可以检查该值是否不存在,并为where提供一个“任何”通配符参数,以返回“所有”结果,而不必编写请求的所有条件组合?

例如,我正在基于n参数查询表:

$data = Model::where('param1', $request->param1)
                   .where('param2', $request->param2)
                   .where('param3', $request->param3)

                   ....

                   .get();

如果不存在参数来告诉查询生成器匹配所有内容,是否可以提供某种通配符?

示例:

$data = Model::where('param1', $request->param1 ? $request->param1 : 'wildcard')

                    ...

                    .get();

因此,例如,如果请求不带参数,它将查询表中的所有内容,但是如果只有一个参数,则将基于给定参数选择结果查询。

这将允许我编写一个查询,而不是编写条件查询的每种组合以匹配参数。

sql laravel eloquent wildcard
3个回答
1
投票

我真的不建议您在此处使用通配符(例如param1 LIKE %之类的东西。

尝试在您的控制器上进行如下操作:

$allowedFilters = [
    'param1',
    'param2',
    /* ... */
];

$query = Model:: query();

foreach ($allowedFilters as $allowedFilter) {
    if ($request->has($allowedFilter)) {
        $query->where($allowedFilter, $request->get($allowedFilter));
    }
}

$data = $query->get();

这样,您就不会在查询中添加不必要的where子句,并且只允许使用某些列名即可防止SQL注入(和不需要的过滤器)。


0
投票

嗯,经过一些简短的研究后,我found an article描述了解决我的问题的模式。基本上构造一个查询并根据所提供的内容进行链式构建:

    $data = $data->newQuery();

    if ($request->has('param1')) {
        $data->where('param1', $request->input('param1'));
    }

    if ($request->has('param2')) {
        $data->where('company', $request->input('param2'));
    }

    if ($request->has('param3')) {
        $data->where('city', $request->input('param3'));
    }

    // Continue for all of the filters.

    // Get the results and return them.
    return $data->get();

0
投票

您可以将每个参数保存在变量中,并考虑到如果不存在该参数,则该变量的值为null。然后,在查询中可以使用when()方法,该方法对于null值将为false:

$param1 = $request->param1;
$param2 = $request->param2;

$data = Model::when($param1, function ($query) use ($param1) {
        $query->where('param1', $param1);
    })
    ->when($param2, function ($query) use ($param2) {
        $query->where('param2', $param2);
    })
    // ...
    ->get();

如果不存在任何参数,则仅执行get(),即它将带入该模型的所有记录

© www.soinside.com 2019 - 2024. All rights reserved.