gpt4 book ai didi

symfony - 使用哪个更快更好 - 查询数据库或迭代数组以查找元素之和

转载 作者:行者123 更新时间:2023-12-03 09:27:07 25 4
gpt4 key购买 nike

我正在使用 Symfony 2.2 和 Doctrine。我有实体产品,其中有价格字段。在我的 Controller 中,我需要获取一些产品。所以我有这样的东西:

$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 这不是重复吗?所以我无法决定哪个更好。

如果您向我展示最佳实践是什么,我将非常感激。预先非常感谢您! :)

最佳答案

执行第二种方法。出于相同目的,数据库聚合查询的执行速度比 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 承担

不适用的情况:如果您要显示每一行和总和,则计算相同的值比执行另一个查询更明智

关于symfony - 使用哪个更快更好 - 查询数据库或迭代数组以查找元素之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18181042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com