bugfix> php > 投稿

私は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 そして、私はそれを行うために何も見なかった、私はメソッドユニオン/マージで試しましたが、私がしたいことをしません

ご協力いただきありがとうございます!

回答 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
        }
      ]
    }
    
    

    詳細については:

    https://laravel.com/docs/5.5/collections#method-transform

    https://laravel.com/docs/5.5/collections#method-intersectbykeys

あなたの答え