克隆模型查询是否会避免在 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
对象时才有意义。
我想计算不同列的总和,我可以使用以下两种方法来完成:
第一种方式
$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
对象时才有意义。