Doctrine2 Присоединяйтесь к СУММ - PullRequest
5 голосов
/ 27 марта 2012

Я пытаюсь выяснить, как лучше всего это сделать в Doctrine 2.

У меня есть учетная запись, в которой есть объект OneToMany to Transaction.Мне нужно СУММАТЬ все значения из Транзакции, отфильтрованные по счету.Это похоже на SQL: SELECT a.*, SUM(t.amount) AS balance FROM account a INNER JOIN transaction t ON t.account_id = a.id

Метод # 1:

Непосредственно на Entity

class Account {
    // some other definitions

    /**
     * @OneToMany(targetEntity="Transaction", mappedBy="account")
     */
    private $transactions;

    public function getBalance() {
        $balance = 0;
        foreach ($this->transactions as $transaction){
            $balance += $transaction->getAmount();
        }
        return $balance;
    }
}

Я думаю, что это худший способ, так как он выбирает все связанныетранзакций, чтобы получить их сумму.

Метод # 2:

Использование репозиториев

class TransactionRepository {
    public function getBalanceByAccount(Account $account){
        $query = $this->em->createQuery("SELECT SUM(t.amount) FROM Transaction t INNER JOIN t.Account a WHERE a.id = ?");
        // ...
        return $query->getSingleScalarResult();
    }
}

Я не совсем уверен, идет ли он в TransactionRepository или AccountRepository.

Метод # 3:

Использование шаблона службы

class TransactionService {
    public function getBalanceByAccountId($accountId){
        $query = $this->em->createQuery("SELECT SUM(t.amount) FROM Transaction t INNER JOIN t.Account a WHERE a.id = ?");
        // ...
        return $query->getSingleScalarResult();
    }
}

Опять же, я не уверен, работает ли он на TransactionService или AccountService.

Метод # 4:( Гильерме Бланко )

Денормализация таблицы, сохранение баланса в таблицу счетов / сущность.

Метод #n:

Пожалуйста, дайте мне знать ваше предложение.

1 Ответ

6 голосов
/ 27 марта 2012

Помните, что не всегда вы можете иметь полностью нормализованную базу данных.Это ситуация, в которой я бы рекомендовал денормализацию, имея баланс в вашей учетной записи.

Затем, когда вы сохраняете, просто помните, что все новые транзакции должны быть суммированы на баланс и обновитезначение баланса в конце.

При этом вам никогда не нужно генерировать SUM (), что намного лучше для вашего приложения.

...