在 Laravel 中,如果你想为模型(Model)设置默认排序,你可以通过重写模型的 boot 方法来实现。在 boot 方法中,你可以使用 Eloquent 的查询构建器来定义默认排序。
以下是如何为模型设置默认排序的步骤:
- 打开你的模型文件(通常位于
app/Models目录下)。 - 在模型中,找到或添加
boot方法。 - 在
boot方法中,使用addingGlobalScope方法来添加一个全局作用域,该作用域会定义默认排序。
以下是一个示例,展示了如何为 Product 模型设置默认按 created_at 字段降序排序:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Product extends Model
{
// ... 其他模型代码 ...
/**
* Bootstrap any application services.
*
* @return void
*/
protected static function boot()
{
parent::boot();
// 添加一个全局作用域以设置默认排序
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('created_at', 'desc');
});
}
}
在这个例子中,我们定义了一个名为 order 的全局作用域,它会对查询结果按照 created_at 字段进行降序排序。现在,每次你从这个模型获取集合时(例如通过 Product::all() 或 Product::get()),都会自动应用这个排序。
请注意,全局作用域会影响该模型的所有查询,除非你在特定查询中明确地覆盖它。如果你只想在某些情况下应用默认排序,你可能需要考虑使用本地作用域而不是全局作用域,并在需要时手动应用它。
此外,如果你正在使用 Laravel 8 或更高版本,你也可以考虑使用模型属性 $orderBy 来定义默认排序,但这通常用于关联查询的默认排序,而不是模型本身的查询。例如:
protected $orderBy = ['created_at' => 'desc'];
但是,请注意,$orderBy 属性只影响与模型关联的查询(如 hasMany, belongsTo 等),而不影响直接从模型获取的查询。因此,对于直接查询模型的情况,使用 boot 方法添加全局作用域仍然是更好的选择。