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

Laravel中计算两个集合中共同receiver_id的总数

问题描述

我有两个来自同一模型的集合C1和C2,集合结构包含id, sender_id, receiver_id, status字段:

  • C1:当前用户(sender_id为auth()->id())且status为'added'的friendships记录
  • C2:指定用户(sender_id为$user->id)且status为'added'的friendships记录

C1实例

#items: array:3 [▼
  0 => {#1417 ▼
    +"id": 21
    +"sender_id": 19
    +"receiver_id": 13
    +"status": "added"
    +"created_at": "2022-08-09 19:28:24"
    +"updated_at": "2022-08-09 19:28:24"
  }
  1 => {#1416 ▼
    +"id": 22
    +"sender_id": 19
    +"receiver_id": 11
    +"status": "added"
    +"created_at": "2022-08-09 19:28:28"
    +"updated_at": "2022-08-09 19:28:28"
  }
  2 => {#1419 ▼
    +"id": 23
    +"sender_id": 19
    +"receiver_id": 12
    +"status": "added"
    +"created_at": "2022-08-09 19:28:32"
    +"updated_at": "2022-08-09 19:28:32"
  }
]
#escapeWhenCastingToString: false

C2实例

#items: array:3 [▼
  0 => {#1407 ▼
    +"id": 24
    +"sender_id": 18
    +"receiver_id": 13
    +"status": "added"
    +"created_at": "2022-08-09 19:28:52"
    +"updated_at": "2022-08-09 19:28:52"
  }
  1 => {#1398 ▼
    +"id": 25
    +"sender_id": 18
    +"receiver_id": 11
    +"status": "added"
    +"created_at": "2022-08-09 19:28:57"
    +"updated_at": "2022-08-09 19:28:57"
  }
  2 => {#1412 ▼
    +"id": 26
    +"sender_id": 18
    +"receiver_id": 12
    +"status": "added"
    +"created_at": "2022-08-09 19:29:01"
    +"updated_at": "2022-08-09 19:29:01"
  }
]
#escapeWhenCastingToString: false

现有方法代码

public function mutualFriend(User $user)
{
    $C1 = DB::table('friendships')->where('sender_id', auth()->id())->where('status', 'added')->get();
    $C2 = DB::table('friendships')->where('sender_id', $user->id)->where('status', 'added')->get();
    // 需在此计算共同receiver_id的数量,示例中应为3
}

需求:计算两个集合中共同的receiver_id数量,示例结果为3,需使用pluck()方法处理。


解决方案

方法一:集合层面处理(基于pluck)

通过pluck()提取两个集合的receiver_id,再利用集合的交集方法统计数量:

public function mutualFriend(User $user)
{
    // 直接提取receiver_id集合,减少内存占用
    $c1Receivers = DB::table('friendships')
        ->where('sender_id', auth()->id())
        ->where('status', 'added')
        ->pluck('receiver_id');
        
    $c2Receivers = DB::table('friendships')
        ->where('sender_id', $user->id)
        ->where('status', 'added')
        ->pluck('receiver_id');

    // 计算交集并统计数量
    $mutualCount = $c1Receivers->intersect($c2Receivers)->count();

    return $mutualCount;
}

也可以转成数组后用原生PHP函数处理:

public function mutualFriend(User $user)
{
    $C1 = DB::table('friendships')->where('sender_id', auth()->id())->where('status', 'added')->get();
    $C2 = DB::table('friendships')->where('sender_id', $user->id)->where('status', 'added')->get();

    $c1Ids = $C1->pluck('receiver_id')->toArray();
    $c2Ids = $C2->pluck('receiver_id')->toArray();

    $mutualCount = count(array_intersect($c1Ids, $c2Ids));

    return $mutualCount;
}

方法二:数据库层面查询(更高效)

如果数据量较大,直接在数据库中计算交集比拉取全量数据更高效,推荐使用:

public function mutualFriend(User $user)
{
    $mutualCount = DB::table('friendships as f1')
        ->where('f1.sender_id', auth()->id())
        ->where('f1.status', 'added')
        ->join('friendships as f2', 'f1.receiver_id', '=', 'f2.receiver_id')
        ->where('f2.sender_id', $user->id)
        ->where('f2.status', 'added')
        ->count();

    return $mutualCount;
}

内容的提问来源于stack exchange,提问作者Muhammad Zohaib Nawaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:36:26