关于在lumen/laravel中使用count时返回值为0的问题

之前有用lumen在做项目的api,因为要用到分页查询,而lumen不能用laravel自带的分页查询,于是用了网上提供的思路(lumen与laravel用的是同一个数据库方法)

以下是分页方法的代码:

    private function pagination($request, $dbBuild) {
        $this->validate($request, [
            'pageSize' => 'bail|filled|integer',
            'pageIndex' => 'bail|filled|integer',
        ]);
        $pageSize = $request->input('pageSize', $this->defaultPageSize);
        $pageIndex = $request->input('pageIndex', $this->defaultPageIndex);
        $offset = $pageSize * ($pageIndex - 1);
        $total = $dbBuild->count();
        $dbBuild = $dbBuild
                ->offset($offset)
                ->limit($pageSize);
        return [
            'data' => $dbBuild->get(),
            'total' => $total,
        ];
    }

以下是我使用时的代码:

//...其他代码
   $dbBuild = DB::connection('dbname')
    ->table('table')
    ->where('id',$id);
   $data = $this->pagination($request,$dbBuild)['data'];
   $count = $this->pagination($request,$dbBuild)['total'];
//...其他代码

复现方法:
第一次的请求数据为

id = 50
pageSize = 14
pageIndex = 1

第二次的请求数据为

id = 50
pageSize = 14
pageIndex = 2

在第二次的请求时返回的count值为0

lumen与laravel用的是同一个数据库方法,本人水平比较低,源码没有弄明白

奇怪的是,使用$dbBuild->count()同样取不到数据,但使用DB::connection('dbname')->table('table')->where('id',$id)->count()就可以

打印了$dbBuild与查询语句发现只有以下不同
不同之处
猜测可能是长连接的问题?
我的解决方案:

//...其他代码
   $dbBuild = DB::connection('dbname')
    ->table('table')
    ->where('id',$id);
   $pagination = $this->pagination($request,$dbBuild);
   $data = $pagination['data'];
   $count = $pagination['total'];
//...其他代码

改为以上代码就可以正常的返回count值

想看看大佬们对这个问题的看法

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

方法已经返回了想要的数据,然后你第一次重复调用,对象已经不是这个$dbBuild最初的对象了

9个月前 评论
AdminWELT (楼主) 9个月前
讨论数量: 2

方法已经返回了想要的数据,然后你第一次重复调用,对象已经不是这个$dbBuild最初的对象了

9个月前 评论
AdminWELT (楼主) 9个月前

因为第一次调用 $this->pagination($request,$dbBuild); 的时候 $dbBuild已经发生了变化了 所以第二次值就不一样了 第二种写法是正确的 因为已经拿到了data 和count 为啥 还要再去请求一次函数呢

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!