Laravel группа 2 Коллекция по ключу - PullRequest
0 голосов
/ 25 мая 2018

Я работаю над проектом 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, но не делайте, что я хочу

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 25 мая 2018

Предположим, у вас есть коллекция с именем $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
    }
  ]
}

Для болееинформация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...