Doctrine orm 更好的方法来获得条令2中关联实体字段的总和?

Doctrine orm 更好的方法来获得条令2中关联实体字段的总和?,doctrine-orm,Doctrine Orm,如何获取关联实体的字段总和?例如,发票和票据分别具有一对一和多对一关系,即一张发票可以有多张票据。票据实体具有“金额”列。发票如何计算相关账单的金额?您要求的是“更好的方法”,但不清楚您现在使用的是什么方法 除非您需要优化,否则我将在您的Invoice实体类中有一个方法,如: public function getTotal(){ $total = 0; foreach($this->bills as $b){ $total += $b->amount

如何获取关联实体的字段总和?例如,发票和票据分别具有一对一和多对一关系,即一张发票可以有多张票据。票据实体具有“金额”列。发票如何计算相关账单的金额?

您要求的是“更好的方法”,但不清楚您现在使用的是什么方法

除非您需要优化,否则我将在您的Invoice实体类中有一个方法,如:

public function getTotal(){
    $total = 0;
    foreach($this->bills as $b){
        $total += $b->amount;
    } 
    return $total;
}
它不是特别优化的,但是它很好而且清晰

如果您决定需要对其进行优化,您可以:

A) 创建一些了解entitymanager的服务类,该类有一个类似getInvoiceTotal(Entity\Invoice$Invoice)的方法,该方法执行DQL查询以从数据库中获取SUM()

B) 将运行总计作为发票的属性保留。在添加/删除/更新账单时,使用生命周期回调更新发票总额。

您要求的是“更好的方法”,但不清楚您现在使用的是什么方法

除非您需要优化,否则我将在您的Invoice实体类中有一个方法,如:

public function getTotal(){
    $total = 0;
    foreach($this->bills as $b){
        $total += $b->amount;
    } 
    return $total;
}
它不是特别优化的,但是它很好而且清晰

如果您决定需要对其进行优化,您可以:

A) 创建一些了解entitymanager的服务类,该类有一个类似getInvoiceTotal(Entity\Invoice$Invoice)的方法,该方法执行DQL查询以从数据库中获取SUM()

B) 将运行总计作为发票的属性保留。在添加/删除/更新账单时,使用生命周期回调更新发票的总额。

原则页面概述了一些解决此问题的可能方法。它们与@timdev所描述的内容类似,但提供了更多的实施细节,并指出了每一个方面的注意事项。

条令页面概述了一些可能的解决方案。它们与@timdev所描述的内容类似,但提供了更多的实现细节,并指出了每种方法的注意事项

public function getTotal(){
$total = 0;
foreach($this->bills as $b){
    $total += $b->amount;
} 
return $total;
}
就我个人而言,我不喜欢上面的解决方案和原则,如果您正在寻找一条记录,它是合适的/优化的。 如果必须按如下所示聚合多个记录:

|---invoice_id----|---bill total---| 
|       1         |      100       |
|       2         |      200       |
|       3         |      300       |
这将获取相关发票的所有相关账单。因此,对于n个发票记录,它将获取每个发票的所有相关发票,从而影响优化

针对这种情况,我做了如下工作:

 <?php
class InvoiceDTO
{
    public function __construct($id, $total)
    {
    // Bind values to the object properties.
         $this->invoiceId=$id;
         $this->total= $total;
    }
}
  $query = $em->createQuery('SELECT NEW InvoiceDTO(i.id,SUM(b.amount)) FROM Invoice i JOIN i.bill b  GROUP BY i');
  $users = $query->getResult(); // array of InvoiceDTO

就我个人而言,我不喜欢上面的解决方案和原则,如果您正在寻找一条记录,它是合适的/优化的。
如果必须按如下所示聚合多个记录:

|---invoice_id----|---bill total---| 
|       1         |      100       |
|       2         |      200       |
|       3         |      300       |
这将获取相关发票的所有相关账单。因此,对于n个发票记录,它将获取每个发票的所有相关发票,从而影响优化

针对这种情况,我做了如下工作:

 <?php
class InvoiceDTO
{
    public function __construct($id, $total)
    {
    // Bind values to the object properties.
         $this->invoiceId=$id;
         $this->total= $total;
    }
}
  $query = $em->createQuery('SELECT NEW InvoiceDTO(i.id,SUM(b.amount)) FROM Invoice i JOIN i.bill b  GROUP BY i');
  $users = $query->getResult(); // array of InvoiceDTO