thinkphp5提供withCount()方法封装withSum()和调用

2019-03-1009:58:03后端程序开发Comments6,891 views字数 1105阅读模式

针对hasMany()进行封装,hasOne()等类似,假如有两张表,user(用户表),和order(订单表),我们要做的是统计每个用户订单里的fee字段的总和。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9885.html

Query.php 添加文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9885.html

//统计求和
    public function withSum($relation, $subQuery = true, $sum='sum')
    {
        if (!$subQuery) {
            $this->options['with_sum'] = $relation;
        } else {
            $relations = is_string($relation) ? explode(',', $relation) : $relation;
            if (!isset($this->options['field'])) {
                $this->field('*');
            }
            foreach ($relations as $key => $relation) {
                $closure = false;
                if ($relation instanceof \Closure) {
                    $closure  = $relation;
                    $relation = $key;
                }
                $relation = Loader::parseName($relation, 1, false);
                $count    = '(' . $this->model->$relation()->getRelationSumQuery($closure, $sum) . ')';
                $this->field([$count => Loader::parseName($relation) . '_sum']);
            }
        }
        return $this;
    }

HasMany.php 添加:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9885.html

public function getRelationSumQuery($closure, $sum)
    {
        if ($closure) {
            call_user_func_array($closure, [ & $this->query]);
        }
        $localKey = $this->localKey ?: $this->parent->getPk();
        return $this->query->whereExp($this->foreignKey, '=' . $this->parent->getTable() . '.' . $localKey)->fetchSql()->sum($sum);
    }

调用方法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9885.html

 $data = model('user')->withSum('order', 'fee')->select();

widthSum('order'),这里的order指的是模型里针对hasMany添加的一个方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9885.html

    public function order()
    {
        return $this->hasMany('Order');
    }
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9885.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/9885.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定