![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/ts.corals.io/corals-api/Corals/core/Foundation/DataTables/ |
<?php namespace Corals\Foundation\DataTables; use Carbon\Carbon; use Illuminate\Support\Arr; use Yajra\DataTables\Contracts\DataTableScope; class CoralsScope implements DataTableScope { public $filters; public function __construct($filters) { $this->filters = $filters; } public function apply($query) { $filters = $this->filters; if (empty($filters)) { return $query; } $requestFilters = request()->get('filters'); if (!is_array($requestFilters)) { $requestFilters = urldecode($requestFilters); $requestFilters = get_request_filters_array($requestFilters); } $requestFilters = array_merge(request()->only(array_keys($filters)), $requestFilters); if (empty($requestFilters)) { return $query; } $baseTable = $query->getModel()->getTable(); foreach ($requestFilters as $column => $value) { $filter = Arr::get($filters, $column, Arr::get($filters, $column . "[]")); if (empty($filter) || (!($value || $value === 0 || $value === 0.0 || $value === false) && !in_array($filter['type'] ?? null, ['number', 'number_range']) && is_numeric($value)) ) { continue; } if (\Arr::get($filter, 'ignore_query_scope', false)) { continue; } $builder = data_get($filter, 'builder'); if (class_exists($builder)) { app($builder)->apply($query, $column, $value); continue; } $condition = $filter['condition'] ?? '='; $relation = null; $column = Arr::get($filter, 'column', $column); if (stripos($column, '.') != false) { list($relation, $column) = explode('.', $column); } if ($isJson = data_get($filter, 'is_json')) { $function = 'json'; $jsonColumn = $filter['json_column']; $condition = \DB::raw(sprintf("LOWER(json_extract(`%s`,'$.%s')) like LOWER('%%$value%%')", $jsonColumn, $column)); } else { switch ($filter['type'] ?? null) { case 'date': $function = $this->functionMap('date'); break; case 'date_range': $function = $this->functionMap('date_range'); if (is_array($value) && count($value) == 1) { if (isset($value['from'])) { $function = 'whereDate'; $value = $value['from']; $condition = '>='; } elseif (isset($value['to'])) { $function = 'whereDate'; $value = $value['to']; $condition = '<='; } else { $function = 'where'; $value = current($value); } } else { $value['from'] = Carbon::parse($value['from'])->startOfDay()->toDateTimeString(); $value['to'] = Carbon::parse($value['to'])->endOfDay()->toDateTimeString(); } break; case 'number_range': $function = $this->functionMap('between'); if (is_array($value) && count($value) == 1) { $function = 'where'; if (isset($value['from'])) { $value = floatval($value['from']); $condition = '>='; } elseif (isset($value['to'])) { $value = floatval($value['to']); $condition = '<='; } else { $value = floatval(current($value)); } } break; case 'boolean': $function = 'where'; if ($value == 'true') { $value = 1; } else { $value = 0; } break; default: $function = isset($filter['function']) ? $this->functionMap($filter['function']) : 'where'; } } switch ($condition) { case 'like': $value = "%$value%"; break; } if (Arr::get($filter, 'is_morph', false)) { $morphTypes = $filter['morph_types']; $this->buildMorphQuery($query, $relation, $morphTypes, $relation, $function, $column, $condition, $value); } else { $this->buildQuery($relation, $query, $function, $condition, $column, $value, $baseTable); } } return $query; } /** * @param $relation * @param $query * @param $function * @param $condition * @param $column * @param $value * @param $baseTable */ public function buildQuery($relation, $query, $function, $condition, $column, $value, $baseTable): void { if ($relation && method_exists($query->getModel(), $relation)) { $query->whereHas($relation, function ($relQuery) use ($function, $condition, $column, $value, $relation) { $relationBaseTable = $relQuery->getModel()->getTable(); $this->query($relQuery, $function, $relationBaseTable, $column, $condition, $value); }); } elseif ($relation) { $this->query($query, $function, $relation, $column, $condition, $value); } else { $this->query($query, $function, $baseTable, $column, $condition, $value); } } /** * @param $query * @param $function * @param $baseTable * @param $column * @param $condition * @param $value */ protected function query($query, $function, $baseTable, $column, $condition, $value): void { if (in_array($function, ['whereBetween', 'whereNotBetween', 'whereIn', 'whereNotIn'])) { $query->{$function}("$baseTable.$column", $value); } elseif ($function == 'json') { $query->whereRaw($condition); } elseif (in_array($function, ['whereNull', 'whereNotNull'])) { $query->{$function}("$baseTable.$column"); } else { $query->{$function}("$baseTable.$column", $condition, $value); } } protected function buildMorphQuery( $query, $morphColumn, $morphTypes, $relation, $function, $column, $condition, $value ): void { $query->whereHasMorph($morphColumn, $morphTypes, function ($query) use ($relation, $function, $column, $condition, $value) { $relationBaseTable = $query->getModel()->getTable(); $this->query($query, $function, $relationBaseTable, $column, $condition, $value); }); } private function functionMap($function = '') { $functionMap = [ 'between' => 'whereBetween', 'not between' => 'whereNotBetween', 'in' => 'whereIn', 'not in' => 'whereNotIn', 'null' => 'whereNull', 'not null' => 'whereNotNull', 'date' => 'whereDate', 'date_range' => 'whereBetween', ]; $function = $functionMap[$function] ?? 'where'; return $function; } }