【问题标题】:Laravel group 2 Collection by keyLaravel group 2 按键收集
【发布时间】:2018-05-25 16:20:37
【问题描述】:

我正在做一个 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 我什么也没做,我尝试了联合/合并方法,但不要做我想做的事

感谢您的帮助!

【问题讨论】:

    标签: php laravel frameworks


    【解决方案1】:

    假设您有一个名为 $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
        }
      ]
    }
    

    更多信息:

    【讨论】:

    • 感谢您的回答!但是由于某些原因,Laravel 说我这个方法不存在,我在 composer 中是 5.5.*,但无论如何,我会尝试找到一个“hack”来做到这一点
    • @ThéoBenoit 从5.5 开始,方法更改为intersectByKeys。看我的更新。我以为你在 5.4 上,因为你链接了 5.4 的文档...
    • 感谢您的关注,它应该可以工作,我很遗憾自己做了一个函数,但感谢您的帮助,先生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2020-01-06
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多