PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > CMS教程 > Fastadmin

仿照withCount封装withSum方法

管理员 2024-12-14
Fastadmin
7

今天群里小伙伴遇到一个问题,大致想实现这样的.
一个主表,一个附表,主表对应附表是一对多的关系.在查询主表的时候想关联附表的其中的字段总和做一个排序.
以我写的小demo为例,一个投票的程序,活动对应投票记录.在活动主表没有统计总票数的情况下查询出总票数并排序.
首先封装withSum方法,摘自仿照thinkphp5提供的withCount()方法封装withSum().

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

thinkphplibrarythinkmodelrelationHasMany.php添加

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

主表模型里添加关联方法,参考
!a5b10689d73a8532dd21ebca89a5e244.png

控制器里index方法修改,参考
bd06e171511d6dd7fec9d695058ad949.png

然后刷新表格查看返回的数据
bd06e171511d6dd7fec9d695058ad949.png

可以看到新增加的这个总数的字段了.

对应修改js排序!
2e0861844e5faf1671d456a1e9aa3a9b.png

ok,搞定了!


希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部