Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2连接和_Php_Design Patterns_Doctrine Orm - Fatal编程技术网

Php Doctrine2连接和

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

我试图找出在第二条原则中做这件事的最佳方法

我有一个账户实体,它有一个交易实体。我需要对按帐户筛选的事务中的所有值求和。在SQL中是这样的:在t.account\u id=a.id上选择一个.*,SUMt.amount作为帐户a内部联接事务t的余额

方法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:
请告诉我您的建议。

请记住,并非所有时候都可以拥有完全规范化的数据库。 在这种情况下,我建议进行非规范化,在您的账户实体中有余额

然后,无论何时进行储蓄,只要记住所有新的交易都应计入余额,并在最后更新余额值


通过这样做,您永远不需要生成一个总和,这对您的应用程序来说更好。

整个应用程序的成本肯定会更低,但我必须做这个总和来填充帐户的余额。我必须把这个代码放在哪里?在AccountService中使用EntityManager::createQuery之类的方法3?您可以在AccountService中这样做,因为您正在管理Account实体。但是检索总和的查询是TransactionService的一部分,因为它对事务进行操作。