Laravel多对多关联下筛选未被拉黑用户的查询问题及疑问
Laravel多对多拉黑用户查询问题及attach方法疑问解答
一、拉黑用户查询逻辑修复
你的查询语句核心逻辑错误,导致被拉黑用户仍被返回。原代码中whereDoesntHave的使用方向完全搞反了:
错误原因
原代码试图检查当前查询的用户的blockedusers关联中是否存在blocked_id在拉黑列表里的记录,这和你"排除被当前用户拉黑的用户"的需求完全不符。
正确实现方式
方式1:直接通过ID排除(简洁高效)
无需使用关联查询,直接获取拉黑用户ID列表后用whereNotIn过滤:
// 优化:直接pluck,无需先调用get() $blockedUserIds = $user->blockedusers()->pluck('id'); $users = User::whereNotIn('id', $blockedUserIds)->get();
方式2:通过反向关联使用whereDoesntHave
如果希望用关联查询的方式实现,需先在User模型中定义反向关联(表示"被谁拉黑"):
// 在User模型中添加 public function blockers() { return $this->belongsToMany(User::class, 'blockedusers', 'blocked_id', 'blocker_id'); }
然后查询时过滤掉被当前用户拉黑的用户:
$users = User::whereDoesntHave('blockers', function ($query) use ($user) { $query->where('blocker_id', $user->id); })->get();
二、attach方法是否需要调用save?
不需要。attach是Laravel为多对多关联提供的中间表操作方法,调用后会立即执行数据库INSERT语句,直接将关联数据写入blockedusers中间表,无需额外调用save()方法。你的拉黑代码中$user->blockedusers()->attach($blocked_id);已经完成了拉黑操作,无需后续步骤。
内容的提问来源于stack exchange,提问作者gabogabans
相关产品推荐
相关产品推荐

