2

我正在使用 Symfony 2.2 和 Doctrine。我有一个实体产品,它有一个价格字段。在我的控制器中,我需要获取一些产品。所以我有这样的事情:

$products = $this->productRepository->findNeededProducts(some criteria for the products);

然后我需要找到所有需要的产品的价格总和。

哪个更好更快 - 做这样的事情:

$sum = 0;
foreach ($products as $p) {
    $sum += $p->getPrice();
}

或者像这样编写一个新的查询方法:

public function findSumofProcucts(same criteria here)
{
    $q = $this->createQueryBuilder('p')
        ->add('select', 'SUM(p.price)')
        ->where('p.user = :user') //for example  
        ->setParameter('user', $user)
        ->getQuery();

    return $q->getSingleScalarResult();

}

如果我编写查询,这两个查询 - 用于获取所需产品和查找它们的总和将几乎相同,只有总和将具有->add('select', 'SUM(p.price)')并将返回SingleScalarResult,这不是重复吗?所以我无法决定哪个更好。

如果您告诉我最佳做法是什么,我将不胜感激。非常感谢您!:)

4

1 回答 1

4

做第二种方法。出于相同目的,数据库聚合查询的执行速度比 PHP 代码快得多。您必须考虑以下头,我假设您只需要总和,而不需要其余的行

执行时间处理时间

您的数据库软件在聚合查询方面比 PHP 更好。一旦接收到数据以计算总和,PHP 将不得不遍历每个实例。如果可能的话,最好在数据库中执行此操作,因为它无论如何都在处理数据并且具有优化的功能来执行此类操作。

数据传输

如果您只需要总和,那么您将发送许多行,它们的列值您并不真正需要。总而言之,您只转移一个号码。如果行集很大,则传输会产生很大的开销,并且传输数据可能比计算总和花费更长的时间

条件

->where('p.user = :user')//例如
对于where查询,如果条件匹配,您需要再次检查PHP。额外的开销。如果您需要检查外键关系,例如where p.category in (SELECT category_id FROM user_categories as uc WHERE p.user=uc.user). 这将要求您迭代地从数据库中获取每个用户的类别以进行总和。使程序逻辑复杂化

关注点分离

当您可以将数据完全外包给数据库时,数据责任现在也由 PHP 承担

不适用的地方:如果您要显示每一行和总和,则计算相同而不是进行另一个查询更明智

于 2013-08-12T07:04:26.087 回答