Я пытаюсь выяснить, как лучше всего это сделать в 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.
Денормализация таблицы, сохранение баланса в таблицу счетов / сущность.
Метод #n:
Пожалуйста, дайте мне знать ваше предложение.