【问题标题】:Using sum() sql with php ActiveRecord将 sum() sql 与 php ActiveRecord 一起使用
【发布时间】:2012-12-13 15:01:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: php phpactiverecord


    【解决方案1】:

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

    这里使用find_by_sql() 中的Model(返回模型数组):

    $result = FooModel::find_by_sql('SELECT SUM(`value`) AS sum FROM `foo_table`')[0]->sum;
    

    【讨论】:

      【解决方案2】:

      将自定义模型添加到您的 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'));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        相关资源
        最近更新 更多