首页 > 解决方案 > 将查询 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"}]

}

标签: phpjsonlaravel

解决方案


终于
根据 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();
}

推荐阅读