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复用,避免重复代码:
- 先创建复用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'); } }
- 在需要生效的从属模型中引入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
相关产品推荐
相关产品推荐

