我在我的应用程序中使用ActiveRecord。我需要按属性添加许多对象。目前我这样做如下:
foreach($objects as $object):
$result += $object->value;
endforeach;
但这很慢。我想我可以通过 sql sum() 得到相同的结果,但效率更高,所以问题是 ActiveRecord 可以返回 sum() 结果吗?
我在我的应用程序中使用ActiveRecord。我需要按属性添加许多对象。目前我这样做如下:
foreach($objects as $object):
$result += $object->value;
endforeach;
但这很慢。我想我可以通过 sql sum() 得到相同的结果,但效率更高,所以问题是 ActiveRecord 可以返回 sum() 结果吗?
模型中已经实现的唯一聚合函数是count()
. 对于sum()
,您必须使用 SQL 查询。您可以使用不同的类( 或 )来做到Connection
这Table
一点Model
。
这是使用find_by_sql()
(Model
返回模型数组):
$result = FooModel::find_by_sql('SELECT SUM(`value`) AS sum FROM `foo_table`')[0]->sum;
将自定义模型添加到您的 lib/Model.php 文件中
public static function sum($args) {
$args = func_get_args();
$options = static::extract_and_validate_options($args);
$options['select'] = 'SUM('.$args[0]["sum"].')';
if (!empty($args) && !is_null($args[0]) && !empty($args[0]))
{
if (is_hash($args[0]))
$options['conditions'] = (isset($args[0]["conditions"]) ? $args[0]["conditions"] : array());
else
$options['conditions'] = call_user_func_array('static::pk_conditions',$args);
}
$table = static::table();
$sql = $table->options_to_sql($options);
$values = $sql->get_where_values();
return static::connection()->query_and_fetch_one($sql->to_s(),$values);
}
然后调用它:
YourModel::sum(array('conditions' => 'userid = 3', 'sum' => 'your_column'));
或者
YourModel::sum(array('sum' => 'your_column'));