如何通过匹配键及其值来组合两个集合
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;
});
所以,一段时间以来我一直在反对这个问题,但我无法让它只做我需要它做的事情。
我希望能够在我们的数据库中以 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;
});