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