克隆模型查询会避免在Yii2中撤回MySQL查询吗?

时间:2018-08-01 05:53:56

标签: yii 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');

请参考以上两种方法,哪一种效率更高?还是两种方式都会执行相同数量的查询?

1 个答案:

答案 0 :(得分:2)

是否克隆查询都没有关系。 sum()执行实际的SQL查询-如果您调用它三次,则将得到三个查询。

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


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