Есть ли чистый способ включить определенные модели для упорядочения с помощью свойства по умолчанию? Он может работать, расширяя laravel QueryBuilder, но для этого вам придется переделать некоторые из его основных функций - плохая практика.
причина
Главное в этом - одна из моих моделей сильно используется многими другими, и сейчас вам нужно снова и снова использовать этот порядок. Даже при использовании закрытия для этого вам все равно придется называть его. Было бы намного лучше использовать сортировку по умолчанию, поэтому все, кто использует эту модель и не предоставят настраиваемые параметры сортировки, получат записи, отсортированные по умолчанию. Использование репозитория здесь не является вариантом, потому что он загружается.
Решение
Расширение базовой модели:
protected $orderBy;
protected $orderDirection = 'ASC';
public function scopeOrdered($query)
{
if ($this->orderBy)
{
return $query->orderBy($this->orderBy, $this->orderDirection);
}
return $query;
}
public function scopeGetOrdered($query)
{
return $this->scopeOrdered($query)->get();
}
В вашей модели:
protected $orderBy = 'property';
protected $orderDirection = 'DESC';
// ordering eager loaded relation
public function anotherModel()
{
return $this->belongsToMany('SomeModel', 'some_table')->ordered();
}
В вашем контроллере:
MyModel::with('anotherModel')->getOrdered();
// or
MyModel::with('anotherModel')->ordered()->first();