You need to enable JavaScript to run this app. 如何在Laravel中配置模型全局默认排除记录且查询时可显式包含
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 00:06:07