Skip to main content

Black Friday 2025! Only until December 1st: coupon FRIDAY25 for 40% off Yearly/Lifetime membership!

Read more here

ilestis/miscellany

299 stars
2 code files
View ilestis/miscellany on GitHub

Models/Attribute.php

Open in GitHub
use App\Traits\OrderableTrait;
use Illuminate\Database\Eloquent\Model;
 
class Attribute extends Model
{
//
use OrderableTrait;
//
}

app/Traits/OrderableTrait.php

Open in GitHub
use Illuminate\Support\Str;
 
trait OrderableTrait
{
public function scopeOrder($query, $data, $defaultField = 'name')
{
if (strpos($data, $this->orderTrigger) === false) {
if ($defaultField == 'name' && isset($this->orderDefaultField)) {
$defaultField = $this->orderDefaultField;
}
$defaultDir = isset($this->orderDefaultDir) ? $this->orderDefaultDir : 'asc';
 
if ($defaultField == 'events/date') {
return $query
->orderBy('year', $defaultDir)
->orderBy('month', $defaultDir)
->orderBy('day', $defaultDir);
}
return $query->orderBy($defaultField, $defaultDir);
}
 
$field = str_replace($this->orderTrigger, '', $data);
$direction = 'ASC';
 
if (!empty($field) && !Str::contains($field, '/')) {
$segments = explode('.', $field);
if (count($segments) > 1) {
$relationName = $segments[0];
 
if (method_exists($this, $relationName)) {
return $query;
}
 
$relation = $this->{$relationName}();
$foreignName = $relation->getQuery()->getQuery()->from;
return $query
->select($this->getTable() . '.*')
->with($relationName)
->leftJoin($foreignName . ' as f', 'f.id', $this->getTable() . '.' . $relation->getForeignKeyName())
->orderBy(str_replace($relationName, 'f', $field), $direction);
} elseif ($data == 'events/date') {
return $query
->orderBy($this->getTable() . '.year', $direction)
->orderBy($this->getTable() . '.month', $direction)
->orderBy($this->getTable() . '.day', $direction);
} else {
return $query->orderBy($this->getTable() . '.' . $field, $direction);
}
}
 
return $query;
}
}

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.