Laravel,如何按计数对集合进行分组

时间:2017-05-22 06:51:43

标签: php laravel laravel-5 eloquent backend

如何使用数字对集合进行分组。所以我创建了一个接受数字的方法,然后使用该数字对返回的集合进行分组,所以如果我传入4,它将按4分组。下面是数据的原始结构。

{
    'A': [{
        id: 1, 
        id: 2,
        id: 3,
        id: 4,
        id: 5,
        id: 6,
        id: 7
    }],
    'B': [{
        id: 1,
        id: 2,
        id: 3
    }],
    'C': [{
        id: 1,
        id: 2,
        id: 3,
        id: 4
    }]
}

现在我希望它以这种方式格式化数据。

{
    'A': [{
        1: [{
            id: 1, 
            id: 2,
            id: 3,
            id: 4
        }],
        2: [{
            id: 5,
            id: 6,
            id: 7
        }]
    }],
    'B': [{
        1: {
            id: 1,
            id: 2,
            id: 3
        }
    }],
    'C': [{
        1: [{
            id: 1,
            id: 2,
            id: 3,
            id: 4
        }]
    }]
}

这是我的代码。

public function getAllPlayers( num )
{
    $data = Player::orderBy('familyName', 'asc')
        ->join('teams', 'players.primaryClubId', '=', 'teams.clubId')
        ->select(['players.*', 'teams.teamName', 'teams.teamNickname', 'teams.teamCode'])
        ->get()
        ->unique() //remove duplicates
        ->groupBy(function($item, $key) { //group familyName that starts in same letter
            return substr($item['familyName'], 0, 1);
        });

    return $data;
}

我真的很难在laravel中解决这个问题。顺便说一句我使用5.4版本。任何帮助将非常感谢,提前感谢!

1 个答案:

答案 0 :(得分:1)

尝试使用map函数,如下所示:

$data = Player::orderBy('familyName', 'asc')
    ->join('teams', 'players.primaryClubId', '=', 'teams.clubId')
    ->select(['players.*', 'teams.teamName', 'teams.teamNickname', 'teams.teamCode'])
    ->get()
    ->unique()
    ->groupBy(function($item, $key) {
        return substr($item['familyName'], 0, 1);
    })
    ->map(function ($subCollection) {
        return $subCollection->chunk(4); // put your group size
    });
相关问题