/** * 关联查询 * @param $relation * @param \Closure $callback 由于此处 Closure 接受的参数是 Table 类,所以下面调用时封装了一次 * @return static */ public function whereHas($relation, $callback) { $this->original->whereHas($relation, function ($query) use($callback) { call_user_func($callback, lego_table($query)); }); return $this; }
/** * Get things tagged with all of a given comma-separated list of tags. * @param \Illuminate\Database\Query\Builder $query * @param string $tagged */ public function scopeTagged($query, $tagged) { foreach (explode(',', $tagged) as $tag) { $query->whereHas('tags', function ($query) use($tag) { $query->where('name', $tag); }); } return $query; }
/** * Delete All notifications from a * defined category * * @param $category_name int * @param $expired Bool * @return Bool */ public function deleteByCategory($category_name, $expired = false) { $query = $this->notification->whereHas('body', function ($q) use($category_name) { $q->where('name', $category_name); }); if ($expired == true) { return $query->onlyExpired()->delete(); } return $query->delete(); }
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; } }
/** * Take user by roles. * * @param \Illuminate\Database\Query\Builder $query * @param string|array $roles * * @return \Illuminate\Database\Query\Builder */ public function scopeWhichRoles($query, $roles) { return $query->whereHas('roles', function ($query) use($roles) { $roles = is_array($roles) ? $roles : [$roles]; $query->whereIn('name', $roles); }); }
/** * 关联查询 * @param $relation * @param $callback * @return static */ public function whereHas($relation, $callback) { $this->original->whereHas($relation, $callback); return $this; }
/** * @param Builder|QueryBuilder $queryBuilder * @param $hasField * @param $operator * @param $value * @param string $boolean */ protected function buildWhereHas($queryBuilder, $hasField, $operator, $value, $boolean = 'and') { $reversedParts = explode('.', strrev($hasField), 2); $hasField = strrev($reversedParts[1]); $field = strrev($reversedParts[0]); $queryBuilder->whereHas($hasField, function ($query) use($queryBuilder, $field, $operator, $value, $boolean) { $this->buildWhere($query, $field, $operator, $value, $boolean); }); }