如何在Laravel中配置模型全局默认排除记录且查询时可显式包含
解决方案
完全可以实现,Laravel 提供的**全局查询作用域(Global Scope)**刚好匹配你的所有需求,无需额外扩展,直接在对应 Model 中配置即可。
配置默认排除规则
直接在目标 Model 中注册匿名全局作用域即可,以下是示例(假设你的排除规则为:过滤status列值为0的记录):
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class YourModel extends Model { // 模型启动方法 protected static function booted() { // 注册全局作用域,所有查询默认自动附加该过滤条件 static::addGlobalScope('exclude_unwanted', function ($query) { // 此处替换为你自己的排除规则 $query->where('status', '!=', 0); }); } }
配置完成后,所有针对该 Model 的普通查询、关联查询都会自动带上上述过滤条件,无需每次手动编写排除逻辑。
显式包含被默认排除的记录
当你需要查询包含被过滤记录的结果时,只需要调用withoutGlobalScope方法移除指定作用域即可:
// 查询所有记录(包含被默认排除的记录) $allRecords = YourModel::withoutGlobalScope('exclude_unwanted')->get(); // 也可以调用该方法移除所有全局作用域 $allRecords = YourModel::withoutGlobalScopes()->get();
关于你提到的本地作用域(Local Scope)
如果你的场景存在多种可选过滤规则,也可以结合本地作用域使用,不过默认全局排除的需求用全局作用域的实现成本更低、逻辑更清晰。你也可以额外定义本地作用域来快速调用包含过滤记录的查询:
// 在Model中添加本地作用域 public function scopeWithUnwanted($query) { return $query->withoutGlobalScope('exclude_unwanted'); } // 调用时更简洁 $allRecords = YourModel::withUnwanted()->get();
内容的提问来源于stack exchange,提问作者Dan.
相关产品推荐
相关产品推荐

