Eloquent 查询 'any value'
Eloquent query where 'any value'
在这里,我尝试在具有多个参数的控制器中编写通用搜索查询,但是该请求可能没有请求的所有参数。有没有一种方法可以检查该值是否不存在并为 where
提供一个 'any' 通配符参数到 return 'all' 结果而不必编写所有条件组合请求?
例如,我正在查询一个 table 基于 n
params:
$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();
例如,如果请求没有参数,它将查询 table 的所有内容,但如果只有一个参数,结果查询将 select 基于给定的参数.
这将允许我编写一个查询,而不是编写条件查询的所有组合来匹配参数。
我真的不建议在这里使用一些通配符(比如 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 注入(和不需要的过滤器)。
好吧,经过一些简短的研究,我 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();
您可以将每个参数保存在一个变量中,考虑到如果参数不存在,该变量的值将为 null
。然后在查询中,您可以使用 when()
方法,对于 null
值,该方法将为假:
$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();
如果有none个参数,则只执行get()
,即带出该型号的所有记录
在这里,我尝试在具有多个参数的控制器中编写通用搜索查询,但是该请求可能没有请求的所有参数。有没有一种方法可以检查该值是否不存在并为 where
提供一个 'any' 通配符参数到 return 'all' 结果而不必编写所有条件组合请求?
例如,我正在查询一个 table 基于 n
params:
$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();
例如,如果请求没有参数,它将查询 table 的所有内容,但如果只有一个参数,结果查询将 select 基于给定的参数.
这将允许我编写一个查询,而不是编写条件查询的所有组合来匹配参数。
我真的不建议在这里使用一些通配符(比如 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 注入(和不需要的过滤器)。
好吧,经过一些简短的研究,我 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();
您可以将每个参数保存在一个变量中,考虑到如果参数不存在,该变量的值将为 null
。然后在查询中,您可以使用 when()
方法,对于 null
值,该方法将为假:
$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();
如果有none个参数,则只执行get()
,即带出该型号的所有记录