为什么分页的结果类型不一样?

andyzu

问题描述

我在 webman 框架里开发,使用了分页查询数据 forPage($param['page'], $param['perPage']) ,默认 page = 1,perPage = 10 ,我使用了 return json([ 'code' => 200100, 'msg' => "请求成功", 'data' => $data, ]); 来返回json数据格式,但是奇怪的事情发生了,第一页返回的是:

{
    "code": 200100,
    "msg": "请求成功",
    "data": [ 
                篇幅有限,数据省略.......
            ] 
}

如果是第二页的话,返回:

{
    "code": 200100,
    "msg": "请求成功",
    "data": { 
            篇幅有限,数据省略.......
    }
}

第一页 data 是数组格式,第二页data是对象格式。啥原因?

这是我的 SQL:

$data = Db::table('skiinfo')
                    ->selectRaw('id, logo, name, email, phone, areainfo_id, address, images, tag, introduce, lat, lon, lang, created_at, updated_at,
            ( 6371 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(?)) + sin( radians(?) ) * sin( radians( lat ) ) )) AS distance', [$param['lat'], $param['lon'], $param['lat']])
                    ->where('lang', '=', $param['lang'])
                    ->whereNull('deleted_at')
                    ->get()
                    ->forPage($param['page'], $param['perPage'])
                    ->map(function ($res) {
                        $res->logo = config('app.host_name').$res->logo;
                        $res->ticketinfo = Db::table('ticketinfo')
                            ->select('elderly_price', 'adults_price', 'children_price')
                            ->where('skiinfo_id', '=', $res->id)
                            ->get();
                        return $res;
                    });

输出的方式为:

                return json([
                    // 'HTTP_OK' => [200100, '请求成功'],
                    'code' => config('myconfig.statusCode.HTTP_OK')[0],
                    'msg' => config('myconfig.statusCode.HTTP_OK')[1],
                    'data' => $data,
                ]);

最后我加了->toArray(); 也不行。请求大神们指点!

455 3 0
3个回答

six

这样js收到的是数组

return json_encode([0=>0, 1=>1, 2=>2]);

这样收到的是对象

return json_encode([0=>0, 2=>2]);

也就是数组的key不是从0到N的连续值就会判定为对象

$data = array_values($data);

这样强制重置下key应该就好了

  • andyzu 2023-07-12

    感谢six ,按你的方法,再加上 toArray() 就解决了,谢谢!

  • adobe 2023-07-13

    以前也遇到过,发现是某页数据中间中断,比如被unset掉,这时需要重置索引,从1开始,中间不能间断

pader

用 map 在循环中进行查询添加数据,这可不是个好主意。

  • andyzu 2023-07-13

    那应该怎么写更好?小白求示例。

  • pader 2023-07-13

    使用关联模型,可以将循环中的多个查询简化为一个查询,并且自动将数据作为字段关联进来。

muyu

其实就是索引数组和关联数组的区别

  • 暂无评论
🔝