请教一个关于 DB 查询后数据处理的问题

// 第一种
[
{
“id”:1,
“userName”:”管理员”,
“menuName”:”文章管理”
},
{
“id”:1,
“userName”:”管理员”,
“menuName”:”删除文章”
},
{
“id”:1,
“userName”:”管理员”,
“menuName”:”新建文章”
},
]

// 第二种
{
{
“id”:1,
“userName”:”管理员”,
“menuName”: [“文章管理”,”删除文章”,”新建文章”]
}
}

请问第一种格式怎么用DB的方法转成第二种格式啊

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

类似这样:

SELECT locus,GROUP_CONCAT(id) FROM info WHERE locus IN('AB086827','AF040764') GROUP BY locus;

用 GROUP_CONCAT

3年前 评论
zsqlll (楼主) 3年前
        $arr = [
            ['id' => 1, 'user_name' => 'admin', 'menu' => 'admin',],
            ['id' => 1, 'user_name' => 'admin', 'menu' => 'remove',],
            ['id' => 1, 'user_name' => 'admin', 'menu' => 'edit',]
        ];

        $a = collect($arr)
            ->groupBy('user_name')
            ->map(function ($item, $key) {
                return $item->reduce(function ($carry, $menu) {
                    $carry['menu'][] = $menu['menu'];
                    return $carry;
                }, ['id' => 1, 'user_name' => $key, 'menu' => []]);
            })->values();
        $this->info($a);

总感觉还不如直接foreach一把梭来的舒服。。。

3年前 评论
zsqlll (楼主) 3年前

foreach无敌

3年前 评论
Kevin_metnick

你试试 hasMany 绑定你当前的model

3年前 评论
 $arr = [
        ['id' => 1, 'user_name' => 'admin', 'menu' => 'admin',],
        ['id' => 1, 'user_name' => 'admin', 'menu' => 'remove',],
        ['id' => 1, 'user_name' => 'admin', 'menu' => 'edit',],
        ['id' => 2, 'user_name' => 'leo', 'menu' => 'add',],
        ['id' => 2, 'user_name' => 'leo', 'menu' => 'oo',],
    ];

    $a = collect($arr)
        ->groupBy('id');
    $data = [];
    foreach($a as $k =>$s) {
        $sArr = $s->toArray();
        $id = array_column($sArr, 'id');
        $name = array_column($sArr, 'user_name');
        $menu = array_column($sArr, 'menu');
        $data[$k]['id'] = $id[0];
        $data[$k]['name'] = $name['0'];
        $data[$k]['menu'] = $menu;
    }
    $data = array_column($data, null);
    dd(json_encode($data));

你试试看可行

3年前 评论
zsqlll (楼主) 3年前
小彭友 (作者) 3年前
function array_group_by($array) {
    $newArray = [];
    array_map(function($v) use (&$newArray) {
        $newArray[$v['id']]['id'] = $v['id'];
        $newArray[$v['id']]['userName'] = $v['userName'];
        $newArray[$v['id']]['menuName'][] = $v['menuName'];
    }, $array);
    var_dump(array_values($newArray));
}

$arr = [
    [
    'id'=>1,
    'userName'=>'管理员',
    'menuName'=>'文章管理'
    ],
    [
    'id'=>1,
    'userName'=>'管理员',
    'menuName'=>'删除文章'
    ],
    [
    'id'=>2,
    'userName'=>'管理员',
    'menuName'=>'新建文章'
    ],
];
array_group_by( $arr);

遍历数组可以的。记得把json先转数组,不然会报错。

3年前 评论
岁月流沙
    $data = collect([
        [
            "id" => 1,
            "userName" => " 管理员",
            "menuName" => " 文章管理"
        ],
        [
            "id" => 1,
            "userName" => " 管理员",
            "menuName" => " 删除文章"
        ],
        [
            "id" => 1,
            "userName" => " 管理员",
            "menuName" => " 新建文章"
        ]
    ]);
    dd($data->groupBy(function ($item){
        return $item['id'] . '-' . $item['userName'];
    })->map(function ($item) {
        $firstData = array_first($item);
        array_set($firstData , 'menuName', array_pluck($item, 'menuName'));
        return $firstData ;
    })->values()->toArray());

先按规则进行分组,在合并指定分组的数据

3年前 评论

为什么不用foreach呢?

3年前 评论
zsqlll (楼主) 3年前

查出来的数据在没有toArray()之前获取的不就是一个继承了Collection类的对象,那就可以使用Collection的方法处理结果集数据,直接去Collection这个类找一下看下那个方法是可以按你需要的处理, :smile: :smile:

3年前 评论
zsqlll (楼主) 3年前

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