在laravel数据操作中having连缀分页函数paginate出现错误,怎么回事?

数据库数据是这样的:

clipboard.png

想通过having语句把counts > 0的取出来;
用到分页,所以having后面连缀分页函数paginate

clipboard.png

但是这样报错了:

clipboard.png

如果我having后面连缀的是get()函数则没问题,

clipboard.png

是可以查到counts > 0的数据的

clipboard.png

这是怎么回事呢?

having后面连缀分页函数paginate存在的bug还是?
怎么解决好?

阅读 10k
3 个回答

你好,我今天也遇到这个问题了,把Paginate换成simplePaginate即可

paginate源码

public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null)
    {
        $page = $page ?: Paginator::resolveCurrentPage($pageName);
        $total = $this->getCountForPagination($columns);
        $results = $total ? $this->forPage($page, $perPage)->get($columns) : collect();
        return new LengthAwarePaginator($results, $total, $perPage, $page, [
            'path' => Paginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]);
    }

paginate默认取表里的字段,表里是木有counts
可换成skip($offset)->take($limit)

having方法改一下就好了
改成havingRaw()
还有在select()方法类不要直接使用‘count(*) as total’,需要改为
DB::raw('count(*) as total')

完整参考,忽略业务,只看代码

CouponModel::select('product_coupon.*','p.*', DB::raw('count(*) as total'))
            ->where('p.platformId',$platformIds)
            ->leftJoin('product as p','p.productId','=','product_coupon.productId')
            ->groupBy('product_coupon.productId')
            ->havingRaw('count(*) as total','>', 0)
            ->orderBy('id','desc')
            ->orderBy('total','desc')
            ->paginate($this->pageNum);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏