Laravel - преобразование запроса RAW в запрос Eloquent (запрос обновления) - PullRequest
2 голосов
/ 27 мая 2020

У меня есть таблица с именем partner_transaction. В этой таблице у меня есть 4 столбца: id, partner_id, type, amount

|id|partner_id |type     |amount|
|--|------------|---------|------|
|1 |65          |Credit   |50    |
|2 |65          |Credit   |20    |
|3 |65          |Debit    |30    |
|4 |10          |Credit   |30    |

теперь я представляю новый столбец баланса (текущий баланс) в этой таблице, как показано ниже.

|id|partner_id  |type     |amount|balance|
|--|------------|---------|------|-------|
|1 |65          |Credit   |50    |50     |
|2 |65          |Credit   |20    |70     |
|3 |65          |Debit    |30    |40     |
|4 |10          |Debit    |30    |-30    |

Мы хотим заново настроить весь столбец баланса по типу для указанного c партнера (65). Итак, мы пишем необработанный запрос -

update partner_transactions pt
inner join (
select
    id, (select sum(case type when 'Credit' then amount when 'Debit' then -amount end)
    from partner_transactions pt2
    where pt2.partner_id = pt1.partner_id and pt2.id <= pt1.id
    ) balance
    from partner_transactions pt1
    WHERE pt1.partner_id = 65
) ptx
on ptx.id = pt.id AND pt.partner_id = 65
set pt.balance = ptx.balance
WHERE pt.partner_id = 65

Мы используем Laravel 5.2 . Теперь мы хотим преобразовать в красноречие. Итак, мы пишем 2 функции.

01. Для расчета баланса -

private function calculateBalanceQuery()
    {
        return DB::table('partner_transactions as pt1')
            ->where('pt1.partner_id', 65)
            ->selectRaw("id, (select sum(case type when 'Credit' then amount when 'Debit' then -amount end)
                from partner_transactions pt2
                where pt2.partner_id = pt1.partner_id and pt2.id <= pt1.id) balance"
            );
    }

02. Для обновления partner_transaction_table -

public function updateQuery()
    {
        return PartnerTransaction::join(DB::raw('(' . $this->calculateBalanceQuery()->toSql() . ') ptx'), function ($join) {
                $join->on('ptx.id', '=', 'partner_transactions.id')->on('partner_transactions.partner_id', '=', DB::raw("'65'"));
            })
            ->where('partner_transactions.partner_id', 65)
            ->update(['partner_transactions.balance' => 'ptx.balance']);
    }

Но при выполнении этого скрипта произошла ошибка.

QueryException in Connection.php line 729:
SQLSTATE[HY093]: Invalid parameter number (SQL: update `partner_transactions` inner join (select id, (select sum(case type when 'Credit' then amount when 'Debit' then -amount end)
from partner_transactions pt2
where pt2.partner_id = pt1.partner_id and pt2.id <= pt1.id) balance from `partner_transactions` as `pt1` where `pt1`.`partner_id` = ptx.balance) ptx on `ptx`.`id` = `partner_transactions`.`id` and `partner_transactions`.`partner_id` = '65' set `partner_transactions`.`balance` = 65 where `partner_transactions`.`partner_id` = ?)

Так как же нам это преобразовать?

...