如何在Laravel 5.5中排除私有事件?遗留代码修改求助
在Laravel 5.5中排除私有事件的解决方案
嘿,我来帮你搞定这个问题!从你提供的遗留代码来看,现在的查询已经通过isVisibleFor(authUser()->id)处理了可见性,但要排除私有事件,我们可以分两种情况来调整代码:
1. 如果事件表有直接标识私有状态的字段
假设你的events表有个布尔字段is_private,用来标记事件是否私有,那直接在查询链中添加过滤条件即可:
修改后的完整代码示例:
/** * @param $request * * @return mixed */ public function index(EventsFilterRequest $request) { $keys = $request->all(); // 先构建基础查询,统一添加排除私有事件的条件 $baseQuery = $this->eventsQueryBuilder() ->isVisibleFor(authUser()->id) ->where('is_private', false) // 核心:排除私有事件 ->ofOrder('starts_at', 'ASC') ->ofCountry(runtime()->country()->id) ->ofStatus('future'); if (count($keys) === 0) { return $baseQuery; } // 处理带请求参数的情况,基于基础查询继续构建 $events = $baseQuery->... // 补全你原来的过滤逻辑(比如根据$keys添加where条件) return $events; }
2. 如果私有事件需要通过关联/权限逻辑判断
如果私有事件的判断不是靠单一字段,而是依赖关联关系(比如私有事件属于特定用户组)或者复杂权限规则,推荐自定义一个查询Scope来封装逻辑,让代码更清晰:
第一步:在Event模型中定义Scope
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Event extends Model { // ... 其他模型代码 /** * 排除私有事件的查询Scope * 根据你的实际私有规则调整逻辑 */ public function scopeIsNotPrivate($query) { // 示例1:排除关联了私有权限规则的事件 return $query->whereDoesntHave('accessRules', function ($subQuery) { $subQuery->where('type', 'private'); }); // 示例2:如果私有事件仅对创建者可见,排除当前用户无权查看的私有事件 // return $query->where(function($q) { // $q->where('is_private', false) // ->orWhere('creator_id', authUser()->id); // }); } }
第二步:在控制器中使用这个Scope
/** * @param $request * * @return mixed */ public function index(EventsFilterRequest $request) { $keys = $request->all(); // 基础查询中加入自定义Scope $baseQuery = $this->eventsQueryBuilder() ->isVisibleFor(authUser()->id) ->isNotPrivate() // 使用自定义Scope排除私有事件 ->ofOrder('starts_at', 'ASC') ->ofCountry(runtime()->country()->id) ->ofStatus('future'); if (count($keys) === 0) { return $baseQuery; } $events = $baseQuery->... // 补全原有过滤逻辑 return $events; }
额外注意点
- 如果你发现
isVisibleFor方法本来就应该处理私有事件的可见性,但没生效,建议检查这个Scope的实现,看看是否遗漏了对私有状态的判断逻辑。 - 确保
authUser()是你项目中正确获取当前登录用户的辅助函数(等价于auth()->user()),避免出现用户未登录的异常。
内容的提问来源于stack exchange,提问作者Seio. E.
相关产品推荐
相关产品推荐

