Laravel default orderBy
Existe uma maneira limpa de permitir que determinados modelos sejam ordenados por uma propriedade porpadrão? Poderia funcionar estendendo o QueryBuilder do laravel, mas, para fazer isso, você terá que reconectar alguns de seus recursos principais - má prática.
razão
O ponto principal de se fazer isso é - um dos meus modelos é reutilizado por muitos outros e agora você tem que recorrer à ordem repetidas vezes. Mesmo quando usando um fechamento para isso - você ainda tem que chamá-lo. Seria muito melhor poder aplicar uma classificação padrão, portanto, todos que usarem esse modelo e não fornecerem opções de classificação personalizadas receberão registros classificados pela opção padrão. Usar um repositório não é uma opção aqui, porque ele é muito carregado.
SOLUÇÃO
Estendendo o modelo base:
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();
}
Em seu modelo:
protected $orderBy = 'property';
protected $orderDirection = 'DESC';
// ordering eager loaded relation
public function anotherModel()
{
return $this->belongsToMany('SomeModel', 'some_table')->ordered();
}
No seu controlador:
MyModel::with('anotherModel')->getOrdered();
// or
MyModel::with('anotherModel')->ordered()->first();