所以laravel雄辩在每个查询中都使用id asc
作为默认值...这对我来说是个大问题,因为在大多数情况下我需要按id desc
我不认为只是我...你几乎总是希望在视图列表顶部显示新行。
无论是新闻或用户列表还是博客帖子。
诅咒我可以使用->orderBy('id' , 'desc')
,但如果我必须为每个查询写这个,我想我需要在每个项目后看到缩小!
所以我正在寻找一种干净的方式,而不需要为每个模型添加一些东西......显然有Global Scopes
但我需要为每个模型添加id我想要考虑它作为计划B。
所以,我希望在每个查询中全局更改...是否有办法或者我应该选择B计划?
答案 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')
吗?我无法想到任何其他解决方案。