/** * Allows all columns on the current database table to be sorted through * query scope * * @param Illuminate\Database\Eloquent\Builder $query * @param string|array $field * if array: * e.g ['created_at' => 'desc'] * ['created_at' => 'desc', 'id' => 'asc'] * ['created_at' => 'desc', 'id' => 'asc', 'name' => 'asc'] * @param string $sort desc|asc * @return Illuminate\Database\Eloquent\Builder */ public function scopeSort($query, $field = NULL, $sort = NULL) { if (!empty($field) && is_array($field)) { foreach ($field as $sort => $direction) { /* * Return the query sorted */ $query->orderBy($sort, $direction); } return $query; } /* * Make sure both the field and sort variables are present */ if (is_string($field) && is_string($sort)) { /* * Make sure the sort input is equal to asc or desc */ if (strtolower($sort) === 'asc' || strtolower($sort) === 'desc') { /* * Return the query sorted */ return $query->orderBy($field, strtoupper($sort)); } } }
/** * Order the query by given column and director or by * defaults if no arguments given. * * @param Illuminate\Database\Eloquent\Builder $query * @return Illuminate\Database\Eloquent\Builder */ public function scopeOrder($query, $order = null) { $direction = 'desc'; $column = $this->defaultOrderColumn; if ($order) { //split string (created_atAsc) by camelCase into column and direction $s = preg_split('/(?=[A-Z])/', $order); //if we've got direction overwrite default one if (isset($s[1])) { $direction = strtolower($s[1]); } //if we've got column overwrite default one if (isset($s[0])) { $column = $s[0]; } } return $query->orderBy($column, $direction); }
/** * Returns recent reviews. * * @param Illuminate\Database\Eloquent\Builder $query * @return collection */ public function scopeRecent($query) { return $query->orderBy('created_at', 'desc')->limit(6)->get(); }
/** * Returns popular actors. * * @param Illuminate\Database\Eloquent\Builder $query * @return collection */ public function scopePopular($query) { return $query->orderBy('views', 'desc')->limit(6)->get(); }
/** * Returns all news items paginated. * * @param Illuminate\Database\Eloquent\Builder $query * @return collection */ public function scopeNewsIndex($query) { return $query->orderBy('created_at', 'desc')->paginate(20); }
/** * ordina i risultati della query in base a parametri in formato json "{"titolo":1,"tecnica":-1}" * @param Illuminate\Database\Eloquent\Builder $query * @param string $sortOptions una stringa formato json con i parametri per l'ordinamento */ public function scopeSortBy($query, $sortOptions = '{}') { if (is_null($sortOptions)) { return $query; } if (!is_array($sortOptions)) { $sortOptions = json_decode($sortOptions); } foreach ($sortOptions as $column => $direction) { $direction = $direction == -1 ? 'desc' : 'asc'; $query->orderBy($column, $direction); } return $query; }
/** * Order by the data_order param * * @param Illuminate\Database\Eloquent\Builder $query * @param string $order Order direction * @return Illuminate\Database\Eloquent\Builder $query */ public function scopeByOrder($query, $order = 'desc') { $query->orderBy('data_order', $order); return $query; }