Пример #1
0
 protected function process()
 {
     $this->method = 'GET';
     //database save
     switch ($this->action) {
         case "search":
             // prepare the WHERE clause
             foreach ($this->fields as $field) {
                 $field->getValue();
                 $field->getNewValue();
                 $value = $field->new_value;
                 //query scope
                 $query_scope = $field->query_scope;
                 $query_scope_params = $field->query_scope_params;
                 if ($query_scope) {
                     if (is_a($query_scope, '\\Closure')) {
                         array_unshift($query_scope_params, $value);
                         array_unshift($query_scope_params, $this->query);
                         $this->query = call_user_func_array($query_scope, $query_scope_params);
                     } elseif (isset($this->model) && method_exists($this->model, "scope" . $query_scope)) {
                         $query_scope = "scope" . $query_scope;
                         array_unshift($query_scope_params, $value);
                         array_unshift($query_scope_params, $this->query);
                         $this->query = call_user_func_array([$this->model, $query_scope], $query_scope_params);
                     }
                     continue;
                 }
                 //detect if where should be deep (on relation)
                 $deep_where = false;
                 if (isset($this->model) && $field->relation != null) {
                     $rel_type = get_class($field->relation);
                     if (is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\HasOne') || is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\HasMany') || is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\BelongsTo') || is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany')) {
                         if (is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\BelongsTo') and in_array($field->type, array('select', 'radiogroup', 'autocomplete'))) {
                             $deep_where = false;
                         } else {
                             $deep_where = true;
                         }
                     }
                 }
                 if ($value != "" or is_array($value) and count($value)) {
                     if (strpos($field->name, "_copy") > 0) {
                         $name = substr($field->db_name, 0, strpos($field->db_name, "_copy"));
                     } else {
                         $name = $field->db_name;
                     }
                     //$value = $field->value;
                     if ($deep_where) {
                         //exception for multiple value fields on BelongsToMany
                         if (is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany') || is_a($field->relation, 'Illuminate\\Database\\Eloquent\\Relations\\BelongsTo') and in_array($field->type, array('tags', 'checks', 'multiselect'))) {
                             $values = explode($field->serialization_sep, $value);
                             if ($field->clause == 'wherein') {
                                 $this->query = $this->query->whereHas($field->rel_name, function ($q) use($field, $values) {
                                     $q->whereIn($field->rel_fq_key, $values);
                                 });
                             }
                             if ($field->clause == 'where') {
                                 foreach ($values as $v) {
                                     $this->query = $this->query->whereHas($field->rel_name, function ($q) use($field, $v) {
                                         $q->where($field->rel_fq_key, '=', $v);
                                     });
                                 }
                             }
                             continue;
                         }
                         switch ($field->clause) {
                             case "like":
                                 $this->query = $this->query->whereHas($field->rel_name, function ($q) use($field, $value) {
                                     $q->where($field->rel_field, 'LIKE', '%' . $value . '%');
                                 });
                                 break;
                             case "orlike":
                                 $this->query = $this->query->orWhereHas($field->rel_name, function ($q) use($field, $value) {
                                     $q->where($field->rel_field, 'LIKE', '%' . $value . '%');
                                 });
                                 break;
                             case "where":
                                 $this->query = $this->query->whereHas($field->rel_name, function ($q) use($field, $value) {
                                     $q->where($field->rel_field, $field->operator, $value);
                                 });
                                 break;
                             case "orwhere":
                                 $this->query = $this->query->orWhereHas($field->rel_name, function ($q) use($field, $value) {
                                     $q->where($field->rel_field, $field->operator, $value);
                                 });
                                 break;
                             case "wherebetween":
                                 $values = explode($field->serialization_sep, $value);
                                 $this->query = $this->query->whereHas($field->rel_name, function ($q) use($field, $values) {
                                     if ($values[0] != '' and $values[1] == '') {
                                         $q->where($field->rel_field, ">=", $values[0]);
                                     } elseif ($values[0] == '' and $values[1] != '') {
                                         $q->where($field->rel_field, "<=", $values[1]);
                                     } elseif ($values[0] != '' and $values[1] != '') {
                                         //we avoid "whereBetween" because a bug in laravel 4.1
                                         $q->where(function ($query) use($field, $values) {
                                             return $query->where($field->rel_field, ">=", $values[0])->where($field->rel_field, "<=", $values[1]);
                                         });
                                     }
                                 });
                                 break;
                             case "orwherebetween":
                                 $values = explode($field->serialization_sep, $value);
                                 $this->query = $this->query->orWhereHas($field->rel_name, function ($q) use($field, $values) {
                                     if ($values[0] != '' and $values[1] == '') {
                                         $q->orWhere($field->rel_field, ">=", $values[0]);
                                     } elseif ($values[0] == '' and $values[1] != '') {
                                         $q->orWhere($field->rel_field, "<=", $values[1]);
                                     } elseif ($values[0] != '' and $values[1] != '') {
                                         //we avoid "whereBetween" because a bug in laravel 4.1
                                         $q->orWhere(function ($query) use($field, $values) {
                                             return $query->where($field->rel_field, ">=", $values[0])->where($field->rel_field, "<=", $values[1]);
                                         });
                                     }
                                 });
                                 break;
                         }
                         //not deep, where is on main entity
                     } else {
                         switch ($field->clause) {
                             case "like":
                                 $this->query = $this->query->where($name, 'LIKE', '%' . $value . '%');
                                 break;
                             case "orlike":
                                 $this->query = $this->query->orWhere($name, 'LIKE', '%' . $value . '%');
                                 break;
                             case "where":
                                 $this->query = $this->query->where($name, $field->operator, $value);
                                 break;
                             case "orwhere":
                                 $this->query = $this->query->orWhere($name, $field->operator, $value);
                                 break;
                             case "wherein":
                                 $this->query = $this->query->whereIn($name, explode($field->serialization_sep, $value));
                                 break;
                             case "wherebetween":
                                 $values = explode($field->serialization_sep, $value);
                                 if (count($values) == 2) {
                                     if ($values[0] != '' and $values[1] == '') {
                                         $this->query = $this->query->where($name, ">=", $values[0]);
                                     } elseif ($values[0] == '' and $values[1] != '') {
                                         $this->query = $this->query->where($name, "<=", $values[1]);
                                     } elseif ($values[0] != '' and $values[1] != '') {
                                         //we avoid "whereBetween" because a bug in laravel 4.1
                                         $this->query = $this->query->where(function ($query) use($name, $values) {
                                             return $query->where($name, ">=", $values[0])->where($name, "<=", $values[1]);
                                         });
                                     }
                                 }
                                 break;
                             case "orwherebetween":
                                 $values = explode($field->serialization_sep, $value);
                                 if (count($values) == 2) {
                                     if ($values[0] != '' and $values[1] == '') {
                                         $this->query = $this->query->orWhere($name, ">=", $values[0]);
                                     } elseif ($values[0] == '' and $values[1] != '') {
                                         $this->query = $this->query->orWhere($name, "<=", $values[1]);
                                     } elseif ($values[0] != '' and $values[1] != '') {
                                         //we avoid "whereBetween" because a bug in laravel 4.1
                                         $this->query = $this->query->orWhere(function ($query) use($name, $values) {
                                             return $query->where($name, ">=", $values[0])->where($name, "<=", $values[1]);
                                         });
                                     }
                                 }
                                 break;
                         }
                     }
                 }
             }
             // dd($this->query->toSql());
             break;
         case "reset":
             $this->process_status = "show";
             return true;
             break;
         default:
             return false;
     }
 }
Пример #2
0
 /**
  * Build wildcard query filters.
  *
  * @param  \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder  $query
  * @param  array  $fields
  * @param  array  $keyword
  * @param  string  $group
  *
  * @return void
  */
 protected function buildWildcardQueryFilters($query, array $fields, array $keyword = [])
 {
     foreach ($fields as $field) {
         if (Str::contains($field, '.') && $query instanceof Builder) {
             list($relation, $field) = explode('.', $field, 2);
             $query->orWhereHas($relation, function ($query) use($field, $keyword) {
                 $this->buildWildcardQueryFilterWithKeyword($query, $field, $keyword, 'where');
             });
         } else {
             $this->buildWildcardQueryFilterWithKeyword($query, $field, $keyword, 'orWhere');
         }
     }
 }