首页 > 解决方案 > Laravel group 2 按键收集

问题描述

我正在做一个 Laravel 项目,但遇到了一个问题,我从数据库中得到 2 个东西(费用和付款),它返回一个集合对象。我需要按键对它们进行分组,这里是数组:

    [items:protected] => Array
    (
        [0] => stdClass Object
            (
                [date_payment] => 2018-01-01
                [total_payment] => 19761.62
            )

    )

)

Illuminate\Support\Collection Object
(
[items:protected] => Array
    (
        [0] => stdClass Object
            (
                [date_payment] => 2018-01-29
                [total_charges] => 5184.4399862289
            )

        [1] => stdClass Object
            (
                [date_payment] => 2017-09-04
                [total_charges] => 0
            )

    )

 )

我需要它是这样的:

Illuminate\Support\Collection Object
(
[items:protected] => Array
    (
        [0] => stdClass Object
            (
                [date_payment] => 2018-01-29
                [total_charges] => 5184.4399862289
                [total_payment] => 19761.62
            )

        [1] => stdClass Object
            (
                [date_payment] => 2017-09-04
                [total_charges] => 0
            )

    )

   )

我已经尝试了所有方法,我查看了 Google,查看了 Laravel 文档:https ://laravel.com/docs/5.4/collections#method-union我什么也没做,我尝试了 union/merge 方法,但不要做我想做的事

谢谢你的帮助!

标签: phplaravelframeworks

解决方案


假设您有一个名为的集合$payments

$payment = new StdClass;
$payment->date_payment = '2018-01-01';
$payment->total_payment = 19761.62;

$payments = collect([
    $payment
]);

另一个名为$expenses

$expense1 = new StdClass();
$expense1->date_payment = '2018-01-29';
$expense1->total_charges = 5184.4399862289;

$expense2 = new StdClass();
$expense2->date_payment = '2017-09-04';
$expense2->total_charges = 0;

$expenses = collect([
    $expense1, $expense2
]);

要检索两个集合中具有相同键的元素,可以使用intersectByKeys

$payments->intersectByKeys($expenses);

这将检索与费用集合具有公共键的所有付款。

现在,要更新集合的值,您可以使用以下transform函数:

$payments->transform(function ($payment, $index) use ($expenses) {
    $expense = $expenses->get($index);
    $payment->date_payment = $expense->date_payment;
    $payment->total_charges = $expense->total_charges;

    return $payment;
});

现在,如果将它们结合在一起:

$payments->intersectByKeys($expenses)->transform(function ($payment, $index) use ($expenses) {
    $expense = $expenses->get($index);
    $payment->date_payment = $expense->date_payment;
    $payment->total_charges = $expense->total_charges;

    return $payment;
});

输出

Collection {#277 ▼
  #items: array:1 [▼
    0 => {#272 ▼
      +"date_payment": "2018-01-29"
      +"total_payment": 19761.62
      +"total_charges": 5184.4399862289
    }
  ]
}

了解更多信息:


推荐阅读