You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OctoberCMS如何设置Anonymous Global Scope筛选当前登录用户所属模型记录

OctoberCMS Rainlab.User 从属模型全局作用域配置方案

你现有代码存在两处问题:

  • 将Auth::getUser()写在匿名作用域外部,模型booted启动阶段就会执行,此时请求还未完成认证逻辑、或者在命令行运行场景下都会拿到无效的null值,也无法动态匹配后续登录状态
  • where条件直接传入用户对象,应该取主键id字段做匹配

单模型实现代码

use October\Rain\Database\Builder;
use RainLab\User\Facades\Auth;

protected static function booted()
{
    static::addGlobalScope('filter_by_current_user', function (Builder $builder) {
        // 已登录时仅返回当前用户的对应数据,未登录时返回空集合
        if ($user = Auth::getUser()) {
            $builder->where('user_id', $user->id);
        } else {
            $builder->whereRaw('1 = 0');
        }
    });
}

多模型复用方案(推荐)

如果多个从属模型都需要加这个逻辑,可以封装为Trait复用,避免重复代码:

  1. 先创建复用Trait
<?php namespace Your\Plugin\Traits; // 替换为自己插件的命名空间

use October\Rain\Database\Builder;
use RainLab\User\Facades\Auth;

trait ScopedByCurrentUser
{
    public static function bootScopedByCurrentUser()
    {
        static::addGlobalScope('filter_by_current_user', function (Builder $builder) {
            if ($user = Auth::getUser()) {
                $builder->where('user_id', $user->id);
            } else {
                $builder->whereRaw('1 = 0');
            }
        });
    }

    // 预留跳过作用域的方法,供后台管理员查询全量数据使用
    public function scopeWithoutUserScope($query)
    {
        return $query->withoutGlobalScope('filter_by_current_user');
    }
}
  1. 在需要生效的从属模型中引入Trait即可
class YourModel extends Model
{
    use \Your\Plugin\Traits\ScopedByCurrentUser;

    public $belongsTo = [
        'user' => \RainLab\User\Models\User::class
    ];
}

注意事项

  • 管理员需要查询所有用户的对应数据时,调用YourModel::withoutUserScope()->get()即可跳过全局作用域
  • 如果未登录状态下允许返回全量数据,删除作用域里的else分支即可

内容的提问来源于stack exchange,提问作者Jakef19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:24:01