如何通过匹配键及其值来组合两个集合

How to combine two collections by matching keys and their values

所以,一段时间以来我一直在反对这个问题,但我无法让它只做我需要它做的事情。

我希望能够在我们的数据库中以 Json 的形式存储一组值,但无论如何我无法获得 Laravel 或首先正确格式化对象。

我有三个查询,一个获取用户的用户名和他们的名字,作为一个对象。另外两个使用该对象通过 count() 从我们的数据库中获取每个用户的销售和报价计数。

现在我需要的是要组合的对象。

array:1 [
  "" => array:3 [
    0 => array:7 [
      0 => array:2 [
        "CallCentreID" => "sdickerson"
        "FirstName" => "Sarah"
      ]
      1 => array:2 [
        "CallCentreID" => "wjones"
        "FirstName" => "Wendy"
      ]
      2 => array:2 [
        "CallCentreID" => "aknox"
        "FirstName" => "Alex"
      ]
      3 => array:2 [
        "CallCentreID" => "mking"
        "FirstName" => "Melissa"
      ]
      4 => array:2 [
        "CallCentreID" => "nrowecc"
        "FirstName" => "Neil"
      ]
      5 => array:2 [
        "CallCentreID" => "ejones"
        "FirstName" => "Emma"
      ]
      6 => array:2 [
        "CallCentreID" => "spurnell2"
        "FirstName" => "Simon"
      ]
    ]
    1 => array:5 [
      0 => array:2 [
        "CallCentreID" => "aknox"
        "Sales" => 1169
      ]
      1 => array:2 [
        "CallCentreID" => "ejones"
        "Sales" => 401
      ]
      2 => array:2 [
        "CallCentreID" => "mking"
        "Sales" => 767
      ]
      3 => array:2 [
        "CallCentreID" => "sdickerson"
        "Sales" => 1067
      ]
      4 => array:2 [
        "CallCentreID" => "wjones"
        "Sales" => 716
      ]
    ]
    2 => array:6 [
      0 => array:2 [
        "CallCentreID" => "aknox"
        "Quotes" => 3587
      ]
      1 => array:2 [
        "CallCentreID" => "ejones"
        "Quotes" => 400
      ]
      2 => array:2 [
        "CallCentreID" => "mking"
        "Quotes" => 6975
      ]
      3 => array:2 [
        "CallCentreID" => "nrowecc"
        "Quotes" => 3
      ]
      4 => array:2 [
        "CallCentreID" => "sdickerson"
        "Quotes" => 2686
      ]
      5 => array:2 [
        "CallCentreID" => "wjones"
        "Quotes" => 2734
      ]
    ]
  ]
]

以上内容与我现有的代码最接近;

$Users = User::where('Accesslevel', 'laravelcallcentre')->select('EmailAddress as CallCentreID', 'FirstName')->get(); 

        $Sales = Order::groupBy('CallCentreID')
            // ->whereDate('OrderDate', '=', date('2018-06-21'))
            ->whereIn('CallCentreID', $Users->pluck('CallCentreID'))
            ->where('Status', 'BOOKING')
            ->selectRaw('CallCentreID, count( * ) AS Sales')
            ->get();

        $Quotes = Order::groupBy('CallCentreID')
            // ->whereDate('OrderDate', '=', date('2018-06-21'))
            ->whereIn('CallCentreID', $Users->pluck('CallCentreID'))
            ->where('Status', 'QUOTE')
            ->selectRaw('CallCentreID, count( * ) AS Quotes')
            ->get();

        $collection = collect([$Users, $Sales, $Quotes]);

        $CCData = $collection->groupBy('CallCentreID');

有人有更好的想法吗?我觉得我完全错了。我把它写成一个 foreach 循环,但最终每个用户都有四个查询,很快就会堆积起来。

$sales = $sales->keyBy('CallCentreID');
$quotes = $quotes->keyBy('CallCentreID');

$users = $users->map(function($user) use($sales,$quotes) {
   $user->sales = isset($sales[$user['CallCentreID']]['sales']) ? $sales[$user['CallCentreID']]['sales'] : 0;
   $user->quotes = isset($quotes[$user['CallCentreID']]['quotes']) ? $quotes[$user['CallCentreID']]['quotes'] : 0;
   return $user;
});