php - 将查询 whereClause 条件读取为 JSON 并将其转换为 PHP Laravel 中的 SQL 查询
问题描述
我正在使用 PHP laravel 框架
,我想要的是访问查询 whereClause 参数作为 JSON 并将其转换为字符串查询以从数据库
示例中读取记录:
转换这个:
{"working_years":{">":2,"<":6},"car_name":"someName","car_company":"companyName"}
至:
Select * from my_table where working_years > 2 AND working_years < 5 AND car_name=someName AND car_company = companyName
对我来说重要的部分是“哪里”条件
这是我的代码:
// $query=$request->where;
//for now we access it from a string:
$query = '{"working_years":{">":2,"<":6},"car_name":"someName","car_company":"companyName"}';
if (isset($query)) {
$i = 0;
$whereFieldsAndVals = array([]);// ex:-> [10][name,abc]
try {
$operator = array([]);// ex:-> [10][=,>]
foreach (json_decode($query) as $key => $value) {
if (is_object($value)) {//has custom conditions
$j = 0;
foreach ($value as $k => $v) {
$operator[$i][$j] = $k;
$whereFieldsAndVals[$i][1] = $v;
$j++;
}
} else {
$whereFieldsAndVals[$i][1] = $value;
}
$whereFieldsAndVals[$i][0] = $key;
$i++;
}
} catch (\Exception $exception) {
return $this->customError($exception->getMessage(), 30, 500);
}
}
return $operator;
//this will return:
//[[">","<"]]
//return $whereFieldsAndVals;
//this will return:
//[{"1":6,"0":"working_years"},{"1":"someName","0":"car_name"},{"1":"companyName","0":"car_company"}]
}
解决方案
终于
根据 Jarek Tkaczyk 在这个线程中的回答得到了解决方案:
如何使用 Laravel Eloquent 创建多个 where 子句查询?
我们可以在这个模板中使用 eloquent 运行我们的 where 子句查询:
where([
['column_1', '=', 'value_1'],
['column_2', '<>', 'value_2'],
[COLUMN, OPERATOR, VALUE],
...
])
这是我的新代码:
if (isset($query)) {
$fullQuery = [];
/*
https://stackoverflow.com/questions/19325312/how-to-create-multiple-where-clause-query-using-laravel-eloquent
template:
where([
[COLUMN, OPERATOR, VALUE],
['column_1', '=', 'value_1'],
['column_2', '<>', 'value_2'],
*/
try {
// $query = '{"working_years":{">":2,"<":5,"<>":3},"car_name":"bmw","car_company":"am84"}';
$i = 0;
foreach (json_decode($query,true) as $key => $value) {
if (is_array($value)) {//has custom where condition
$count=count($value);
$j = 0;
foreach ($value as $whereKey => $whereValue) {
$fullQuery[$i+$j][0]=$key;
$fullQuery[$i+$j][1]=$whereKey;
$fullQuery[$i+$j][2]=$whereValue;
$j++;
}
if ($count>0)
$i+=($count-1);
} else {
$fullQuery[$i][0]=$key;
$fullQuery[$i][1]='=';
$fullQuery[$i][2]=$value;
}
$i++;
}
} catch (\Exception $exception) {
return $this->customError($exception->getMessage(), 30, 500);
}
return $table->where($fullQuery)->first();
}
推荐阅读
- c++ - 期望一个“;” 在陌生的地方
- python - 如何将csv文件保存在django的静态文件夹中?
- java - Async HttpClient 可以将请求发布到 https 吗?
- android - Android:meminfo_proc_show() 3.10.65+ 中的引导循环内核恐慌尝试执行 LOS12.1 端口
- c++ - 将 std::string 转换为 const char* 以供 printf 使用
- c++ - 如何为 QTreeview 中的 GroupItem 设置背景颜色?
- docker - 获取集群中所有节点之间的总网络流量
- jquery - 过滤从 X 行开始的表格单元格或行
- html - 如何在 Django 中将这个特定的 HTML 渲染内容作为可下载的文本文件?
- ansible - 运行剧本,将主机作为参数传递,但主机不作为 /ansible/hosts 中的条目存在