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();

questionAnswers(3)

yourAnswerToTheQuestion