Суммируйте несколько строк и обновляйте с помощью group_by столбец. (Laravel Elqoeunt) - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу SUM строк в таблице MySQL, а затем объединить и обновить. Я пытаюсь суммировать все повторяющиеся платежи за день. Я опубликую свой существующий запрос, но есть некоторые ограничения.

Пример:

+----+------------+-------------+-------------+---------+
| id |    date    | merchant_id | investor_id | payment |
+----+------------+-------------+-------------+---------+
|  1 | 27/05/1989 |           4 |           7 |    1000 |
|  2 | 27/05/1989 |           4 |           7 |    1200 |
|  3 | 28/05/1989 |           4 |           7 |    1500 |
|  4 | 28/05/1989 |           4 |           7 |    1000 |
|  5 | 28/05/1989 |           5 |           8 |    1000 |
+----+------------+-------------+-------------+---------+

Ожидаемый результат:

+----+------------+-------------+-------------+---------+
| id |    date    | merchant_id | investor_id | payment |
+----+------------+-------------+-------------+---------+
|  1 | 27/05/1989 |           4 |           7 |    2200 |
|  3 | 28/05/1989 |           4 |           7 |    2500 |
|  5 | 28/05/1989 |           5 |           8 |    1000 |
+----+------------+-------------+-------------+---------+

Я пробовал этот цикл.

foreach ($existing_payments as $key => $payment) 
{
    ParticipentPayment::where('payment_date',$payment->payment_date) ->update(['payment' => \DB::raw("payment+$payment->payment"]);
}      

Проблема 1. Я могу обновлять только один столбец за раз.

Проблема 2. Я программно перебираю строки и обновляю значение, из-за чего, если нет повторяющегося значения, строка не обновляется. Я должен написать еще один запрос для обновления. Удалить существующий запрос также.

Задача 3. Хорошо работает только для двух платежей.

Есть ли какое-нибудь возможное решение в laravel eloquent слияние (с суммой) нескольких строк и обновление?

1 Ответ

0 голосов
/ 29 апреля 2018

Попробуйте это:

$delete = [];
$payments = ParticipentPayment::selectRaw("GROUP_CONCAT(`id` SEPARATOR ',') `ids`")
    ->selectRaw('SUM(`payment`) `sum`')
    ->groupBy('date', 'merchant_id', 'investor_id')
    ->get();
foreach($payments as $payment)
{
    $ids = explode(',', $payment->ids);
    if(count($ids) == 1) continue;
    ParticipentPayment::whereKey($ids[0])->update(['payment' => $payment->sum]);
    $delete = array_merge($delete, array_slice($ids, 1));
}
ParticipentPayment::destroy($delete);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...