Php Doctrine2连接和
我试图找出在第二条原则中做这件事的最佳方法 我有一个账户实体,它有一个交易实体。我需要对按帐户筛选的事务中的所有值求和。在SQL中是这样的:在t.account\u id=a.id上选择一个.*,SUMt.amount作为帐户a内部联接事务t的余额 方法1: 直接对实体Php Doctrine2连接和,php,design-patterns,doctrine-orm,Php,Design Patterns,Doctrine Orm,我试图找出在第二条原则中做这件事的最佳方法 我有一个账户实体,它有一个交易实体。我需要对按帐户筛选的事务中的所有值求和。在SQL中是这样的:在t.account\u id=a.id上选择一个.*,SUMt.amount作为帐户a内部联接事务t的余额 方法1: 直接对实体 class Account { // some other definitions /** * @OneToMany(targetEntity="Transaction", map
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:
请告诉我您的建议。请记住,并非所有时候都可以拥有完全规范化的数据库。 在这种情况下,我建议进行非规范化,在您的账户实体中有余额 然后,无论何时进行储蓄,只要记住所有新的交易都应计入余额,并在最后更新余额值
通过这样做,您永远不需要生成一个总和,这对您的应用程序来说更好。整个应用程序的成本肯定会更低,但我必须做这个总和来填充帐户的余额。我必须把这个代码放在哪里?在AccountService中使用EntityManager::createQuery之类的方法3?您可以在AccountService中这样做,因为您正在管理Account实体。但是检索总和的查询是TransactionService的一部分,因为它对事务进行操作。