将所有查询的默认ORDER BY从ASC更改为DESC

时间:2016-08-04 19:15:06

标签: php laravel eloquent laravel-5.2

所以laravel雄辩在每个查询中都使用id asc作为默认值...这对我来说是个大问题,因为在大多数情况下我需要按id desc

排序数据

我不认为只是我...你几乎总是希望在视图列表顶部显示新行。

无论是新闻或用户列表还是博客帖子。

诅咒我可以使用->orderBy('id' , 'desc'),但如果我必须为每个查询写这个,我想我需要在每个项目后看到缩小!

所以我正在寻找一种干净的方式,而不需要为每个模型添加一些东西......显然有Global Scopes但我需要为每个模型添加id我想要考虑它作为计划B。

所以,我希望在每个查询中全局更改...是否有办法或者我应该选择B计划?

3 个答案:

答案 0 :(得分:1)

您可以更改Laravels默认订单

/**
 * Add an "order by" clause to the query.
 *
 * @param  string  $column
 * @param  string  $direction
 * @return $this
 */
public function orderBy($column, $direction = 'asc')
{
    $this->{$this->unions ? 'unionOrders' : 'orders'}[] = [
        'column' => $column,
        'direction' => strtolower($direction) == 'asc' ? 'asc' : 'desc',
    ];
    return $this;
}

在/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

变化:

public function orderBy($column, $direction = 'asc')

为:

public function orderBy($column, $direction = 'desc')

@Grzegorz Gajda是正确的,你不应该编辑Laravel Code。最佳解决方案是按照设计使用Laravel,当您想要降序时:

->orderBy('id' , 'desc');

答案 1 :(得分:1)

出于您的目的,您可以使用自定义BaseClass来定义desc的默认orderBy属性,然后您可以将模型扩展到此类而不是Model类。

Custom BaseClass:

class BaseClass extends Model{
protected static function boot() {
    parent::boot();
    static::addGlobalScope('order', function (Builder $builder) {
        $builder->orderBy($builder->column,'desc');
    });
  }
}

然后,您希望按desc订购的所有模型,使用此BaseClass进行扩展:
你的型号:

class abcModel extends BaseModel{
//Your code
}

要删除默认行为,请使用:

abcModel::withoutGlobalScope('order')->get();

答案 2 :(得分:0)

您只是简单地创建自己的查询功能并让它调用->orderBy('id' , 'desc')吗?我无法想到任何其他解决方案。