带有很多参数的可选查询
Optional query with a lot of parameter
我一定是从我的商店商品中构建了一个查询。我的商店商品有 10 个字段。我只是让客户在我的项目的可选中搜索。
例如,第一个可能想在 field1 上过滤,第二个可能想在 field1 和 field2 上过滤,第三个可能想在 field6 和 field8 和 filde9 上过滤,...
我怎样才能使查询更短更有效?
注意 1:我不想使用 Raw 方法,因为它存在漏洞。
注 2: 我在 link 1 and 中看到了一些答案,但我认为第一个不能用于
条件如:where('field1','>=','somevalue')
或 where('field2','like','%somevalue%')
或任何具有一定复杂性的条件,第二个条件有更多的“如果”链接,如果可能的话我希望比这更短
您可以通过多种方式执行此操作,具体取决于您喜欢的语法。一种可能的方法是使用分隔符来传递多个参数:
/api/user?where[]=user_id|>=|5
/api/user?where[]=user_id|2
/api/user?where[]=user_id|2&where[]=status|activated
这仅允许您传递多个 where
选项,其中管道 |
运算符分隔参数。请注意,如果您希望管道字符可用作例如搜索参数,这可能会导致问题。
然后您可以像这样简单地将此 url 解析为您的查询:
foreach($request->get('where') as $i => $values) {
$values = explode('|', $values);
// Allow the third argument to be exchanged with the second one,
// similar to how the Laravel `where()` method works.
$query->where($values[0], $values[1], $values[2] ?? null);
}
您可以选择添加验证方法,以便事先正确检查语法。您可以将此代码段添加到服务提供商的某些 boot()
方法中:
\Illuminate\Support\Facades\Validator::extend('query_where', function($attribute, $value) {
// Require minimum length of 2 parameters.
return count(explode('|', $value)) >= 2;
});
接下来,您在控制器操作中的验证将如下所示:
$this->validate($request, [
'where' => 'nullable|array',
'where.*' => 'query_where',
]);
无限可能。
我一定是从我的商店商品中构建了一个查询。我的商店商品有 10 个字段。我只是让客户在我的项目的可选中搜索。 例如,第一个可能想在 field1 上过滤,第二个可能想在 field1 和 field2 上过滤,第三个可能想在 field6 和 field8 和 filde9 上过滤,...
我怎样才能使查询更短更有效?
注意 1:我不想使用 Raw 方法,因为它存在漏洞。
注 2: 我在 link 1 and where('field1','>=','somevalue')
或 where('field2','like','%somevalue%')
或任何具有一定复杂性的条件,第二个条件有更多的“如果”链接,如果可能的话我希望比这更短
您可以通过多种方式执行此操作,具体取决于您喜欢的语法。一种可能的方法是使用分隔符来传递多个参数:
/api/user?where[]=user_id|>=|5
/api/user?where[]=user_id|2
/api/user?where[]=user_id|2&where[]=status|activated
这仅允许您传递多个 where
选项,其中管道 |
运算符分隔参数。请注意,如果您希望管道字符可用作例如搜索参数,这可能会导致问题。
然后您可以像这样简单地将此 url 解析为您的查询:
foreach($request->get('where') as $i => $values) {
$values = explode('|', $values);
// Allow the third argument to be exchanged with the second one,
// similar to how the Laravel `where()` method works.
$query->where($values[0], $values[1], $values[2] ?? null);
}
您可以选择添加验证方法,以便事先正确检查语法。您可以将此代码段添加到服务提供商的某些 boot()
方法中:
\Illuminate\Support\Facades\Validator::extend('query_where', function($attribute, $value) {
// Require minimum length of 2 parameters.
return count(explode('|', $value)) >= 2;
});
接下来,您在控制器操作中的验证将如下所示:
$this->validate($request, [
'where' => 'nullable|array',
'where.*' => 'query_where',
]);
无限可能。