克隆模型查询是否会避免在 Yii2 中调用 MySQL 查询?

Will cloning model query avoid recalling of MySQL query in Yii2?

我想计算不同列的总和,我可以使用以下两种方法来完成:

第一种方式

$obj = $modelClass::findBySql($sql, $params);
$clone = clone $obj;


$grand_amount = $clone->sum('amount');
$grand_tax_amount = $clone->sum('tax_amount');
$grand_total =$clone->sum('total_amount');

第二种方式

$grand_amount = $modelClass::findBySql($sql1, $params)->sum('amount');
$grand_tax_amount = $modelClass::findBySql($sql1,$params)->sum('tax_amount');
$grand_total = $modelClass::findBySql($sql1, $params)->sum('total_amount');

参考以上两种方式,哪种方式效率更高?或者两种方式都会执行相同数量的查询?

是否克隆查询并不重要。 sum() 执行实际的 SQL 查询 - 如果你调用它三次,你将得到三个查询。

从微优化的角度来看 clone 应该比创建同一个查询对象三次更快。但是你不会看到太大的区别——执行真正的 SQL 查询将是这里的主要瓶颈,PHP 开销可以忽略不计。


顺便说一句:从您的示例中克隆没有多大意义 - 您从不使用原始 $obj 并且 $clone 使用了三次。您可以直接使用 $obj 并避免克隆 - 只有当您想要修改克隆查询而不修改原始 ActiveQuery 对象时才有意义。