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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:30:29