Thinkphp 仿withCount封装withSum方法

1、在 thinkphp\library\think\db\Query.php 中添加:

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;
}

2、在 thinkphp\library\think\model\relation\HasMany.php 中添加:

public function getRelationSumQuery($closure, $sum)
{
    if ($closure) {
        call_user_func_array($closure, [ & $this->query]);
    }
    $localKey = $this->localKey ?: $this->parent->getPk();
    $parentTable = $this->parent->getTable();
    $options = $this->parent->getOptions();
    if(isset($options['alias'][$parentTable])){
        $parentTable = $options['alias'][$parentTable];
    }
    return $this->query->whereExp($this->foreignKey, '=' . $parentTable . '.' . $localKey)->fetchSql()->sum($sum);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值