<?php
declare(strict_types = 1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20220816202727 extends AbstractMigration
{
public function getDescription(): string
{
return 'View for account balance';
}
public function up(Schema $schema): void
{
$this->addSql(
'CREATE VIEW account_balance AS
SELECT account_id, SUM(amount) as sum
FROM account_changes ac
GROUP BY account_id'
);
$this->addSql(
'CREATE TRIGGER calculate_balance_on_insert
AFTER INSERT
ON account_changes
FOR EACH ROW
BEGIN
UPDATE accounts
LEFT JOIN account_balance ON accounts.id = account_balance.account_id
SET accounts.balance = IFNULL(account_balance.sum, 0)
WHERE accounts.id = NEW.account_id;
END;'
);
$this->addSql(
'CREATE TRIGGER calculate_balance_on_update
AFTER UPDATE
ON account_changes
FOR EACH ROW
BEGIN
UPDATE accounts
LEFT JOIN account_balance ON accounts.id = account_balance.account_id
SET accounts.balance = IFNULL(account_balance.sum, 0)
WHERE accounts.id IN (NEW.account_id, OLD.account_id);
END;'
);
$this->addSql(
'CREATE TRIGGER calculate_balance_on_delete
AFTER DELETE
ON account_changes
FOR EACH ROW
BEGIN
UPDATE accounts
LEFT JOIN account_balance ON accounts.id = account_balance.account_id
SET accounts.balance = IFNULL(account_balance.sum, 0)
WHERE accounts.id = OLD.account_id;
END;'
);
}
public function down(Schema $schema): void
{
$this->addSql('DROP VIEW account_balance');
$this->addSql('DROP TRIGGER calculate_balance_on_insert');
$this->addSql('DROP TRIGGER calculate_balance_on_update');
$this->addSql('DROP TRIGGER calculate_balance_on_delete');
}
}