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

时间:2018-11-29 15:15:32

标签: laravel laravel-5 laravel-5.2

所以,我已经为此花了好一阵头,但我不能让它做我需要做的事情。

我希望能够以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循环,但最终每个用户有四个查询,堆积得很快。

1 个答案:

答案 0 :(得分:1)

$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;
});