使用sum()sql与php ActiveRecord

时间:2012-12-13 15:01:07

标签: php phpactiverecord

我在我的应用中使用ActiveRecord。我需要按属性添加许多对象。目前我这样做:

foreach($objects as $object):
    $result += $object->value;
endforeach;

但它很慢。我想我可以通过sql sum()获得相同的结果但效率更高,所以问题是ActiveRecord可以返回sum()结果吗?

2 个答案:

答案 0 :(得分:3)

模型中已实现的唯一聚合函数是count()。对于sum(),您必须使用SQL查询。您可以使用不同的类(ConnectionTableModel)执行此操作。

这里使用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'));