diff --git a/app/Http/Controllers/PersonController.php b/app/Http/Controllers/PersonController.php index f13f0f5..74b3b5d 100644 --- a/app/Http/Controllers/PersonController.php +++ b/app/Http/Controllers/PersonController.php @@ -5,7 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Person; use App\Http\Controllers\JsonResponse; - +use Illuminate\Database\Eloquent\Builder; class PersonController extends Controller { @@ -18,88 +18,66 @@ class PersonController extends Controller return response()->json($persons); } + public function process_rule($query,$rules,$condition) + { + $where = null; + $count = 0; + + foreach ($rules as $rule) { + if(array_key_exists("condition",$rule)) { + $where = function ($q) use ($rule) { + $this->process_rule($q,$rule["rules"],$rule["condition"]); + }; + + } else { + switch ($rule["operator"]) { + case "=": + $where = [ $rule["id"], '=', $rule["value"]]; + break; + case "(": + $where = [ $rule["id"], 'LIKE', $rule["value"]."%" ]; + break; + case "!=": + $where = [ $rule["id"], '!=', $rule["value"]]; + break; + case ")": + $where = [ $rule["id"], 'LIKE', "%".$rule["value"]]; + break; + } + } + + if ($query != null) + { + switch ($condition) { + case "and": + $query->where($where); + break; + case "or": + $count == 0 ? $query->where($where) : $query->orWhere($where); + } + } else { + $query = Person::where($where); + } + + $count++; + } + + return $query; + } + public function search(Request $request) { $query = $request->post(); - $result = []; - $where = []; - $qr = null; - $qa = [$qr]; - $q = $qr; - $count = 0; + $currentQuery = $query; + $condition = $currentQuery["condition"]; - foreach ($query as $c) { + $qr = $this->process_rule(null,$currentQuery["rules"],$condition); - if ($c["criteria"]["operator"] == "=") $where = [$c["field"]["name"], $c["pre"] == "NOT" ? '!=' : '=', $c["value"]]; - if ($c["criteria"]["operator"] == "LIKE START") $where = [$c["field"]["name"], $c["pre"] == "NOT" ? 'not like': 'like', $c["value"].'%']; - if ($c["criteria"]["operator"] == "LIKE") $where = [$c["field"]["name"], $c["pre"] == "NOT" ? 'not like': 'like', '%'.$c["value"].'%']; - - // $result[] = $where; - - if ($c["count"] == 0) { - $q = \array_pop($qa); - if ($q == null) - $q = Person::where([$where]); - else - $q->where([$where]); - } - - if ($c["level"] > 0 && $c["count"] == 0) - array_push($qa,$q); - - if ($c["pre"] == 'AND') $q->andWhere($where); - if ($c["pre"] == 'OR') $q->orWhere($where); - if ($c["pre"] == 'AND NOT') $q->whereNot($where); - if ($c["pre"] == 'OR NOT') $q->orWhereNot($where); - - if ($c["groupop"] != "") { - if ($c["count"] == 0) { - $qr2 = function($q) use ($c) { - - }; - array_push($qa,$qr2); - } - } - } - - // DB::connection( 'mongodb' )->enableQueryLog(); if ($qr) $result = $qr->get(); else $result = []; - // dd(DB::connection('mongodb')->getQueryLog()); return response()->json($result); -// { -// "groupop": "", -// "pre": "NOT", -// "field": { -// "name": "fullNames.value", -// "desc": "Plné meno" -// }, -// "value": "sds", -// "criteria": { -// "name": "Rovná sa", -// "operator": "%s" -// }, -// "level": 0, -// "count": 0 -// }, -// { -// "groupop": "", -// "pre": "NOT", -// "field": { -// "name": "fullNames.value", -// "desc": "Plné meno" -// }, -// "value": "sds", -// "criteria": { -// "name": "Rovná sa", -// "operator": "%s" -// }, -// "level": 0, -// "count": 1 -// } -// ] } } diff --git a/app/Models/Person.php b/app/Models/Person.php index 6e38fb3..0ffeace 100644 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -4,12 +4,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Jenssegers\Mongodb\Eloquent\Model; -use Mehradsadeghi\FilterQueryString\FilterQueryString; +// use Mehradsadeghi\FilterQueryString\FilterQueryString; class Person extends Model { use HasFactory; - use FilterQueryString; + // use FilterQueryString; protected $filters = []; protected $connection = 'mongodb';