我在我的应用中使用ActiveRecord。我需要按属性添加许多对象。目前我这样做:
foreach($objects as $object):
$result += $object->value;
endforeach;
但它很慢。我想我可以通过sql sum()获得相同的结果但效率更高,所以问题是ActiveRecord可以返回sum()结果吗?
答案 0 :(得分:3)
模型中已实现的唯一聚合函数是count()
。对于sum()
,您必须使用SQL查询。您可以使用不同的类(Connection
,Table
或Model
)执行此操作。
这里使用find_by_sql()
的{{1}}(返回模型数组):
Model
答案 1 :(得分:0)
将自定义模型添加到您的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'));