1

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

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

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

4

2 回答 2

3

模型中已经实现的唯一聚合函数是count(). 对于sum(),您必须使用 SQL 查询。您可以使用不同的类( 或 )来做到ConnectionTable一点Model

这是使用find_by_sql()Model返回模型数组):

$result = FooModel::find_by_sql('SELECT SUM(`value`) AS sum FROM `foo_table`')[0]->sum;
于 2012-12-14T11:49:25.437 回答
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'));

于 2019-05-21T10:33:36.717 回答