【问题标题】:How to combine two collections by matching keys and their values如何通过匹配键及其值来组合两个集合
【发布时间】:2018-11-30 04:37:31
【问题描述】:

所以,我已经为此苦苦挣扎了一段时间,但我无法让它做我需要它做的事情。

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

【问题讨论】:

  • "Now All I need is the objects to be combined" 是什么意思?你能举例说明你想要的输出应该是什么。至于您的查询,您不能使用雄辩的关系来加载用户的销售和报价吗?您可以使用 withCount 帮助程序,这样您就不必实际加载所有关系而只获取计数。
  • 我希望最终对象显示类似.. 0 => array:2 [ "CallCentreID" => "sdickerson" "FirstName" => "Sarah" "Sales" => 529 “行情” => 892]

标签: laravel laravel-5 laravel-5.2


【解决方案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;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2021-02-07
    • 2019-05-13
    • 2019-11-03
    相关资源
    最近更新 更多