Doctrine2 Присоединиться к SUM

Я пытаюсь выяснить, как лучше всего это сделать в 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:

Непосредственно на объекте

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:

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

5
задан Community 23 May 2017 в 12:15
поделиться