今天群里小伙伴遇到一个问题,大致想实现这样的.
一个主表,一个附表,主表对应附表是一对多的关系.在查询主表的时候想关联附表的其中的字段总和做一个排序.
以我写的小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);}
主表模型里添加关联方法,参考
!
控制器里index方法修改,参考
然后刷新表格查看返回的数据
可以看到新增加的这个总数的字段了.
对应修改js排序!
ok,搞定了!
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。