Php 拉雷维尔雄辩的团队由许多人组成

Php 拉雷维尔雄辩的团队由许多人组成,php,laravel,eloquent,Php,Laravel,Eloquent,我有用户和用户位置表 用户模型 示例数据: 用户: ---------------- | id | name | ---------------- | 1 | Alex | | 2 | Nick | | 3 | John | | 4 | Liam | | 5 | Noah | | 6 | William | | 7 | James | | 8 | Oliver | | 9 | Benjamin| | 10 | Elijah | | 1

我有用户和用户位置表

用户模型

示例数据:

用户:

----------------
| id | name    |
----------------
| 1  | Alex    |
| 2  | Nick    |
| 3  | John    |
| 4  | Liam    |
| 5  | Noah    |
| 6  | William |
| 7  | James   |
| 8  | Oliver  |
| 9  | Benjamin|
| 10 | Elijah  |
| 11 | Lucas   |
----------------
用户位置

------------------------
|  position  | user_id |
------------------------
| Developer  |   1     |
| Designer   |   2     |
| Teacher    |   1     |
| Singer     |   3     |
| Architect  |   3     |
| Accountant |   4     | 
| Baker      |   2     |
| Actress    |   7     |
| Chef       |   11    |
| Butcher    |   10    |
| Carpenter  |   8     |
| Developer  |   9     |       
| Accountant |   11    |       
| Butcher    |   8     |  
| Singer     |   10    |  
| Carpenter  |   7     |   
| Carpenter  |   1     |   
------------------------
在这种情况下,我如何按职位名称对用户进行分组,并得到如下结果:

[
    Developer => [1, 9],
    Designer => [2],
    Teacher => [1],
    Singer => [3, 10],
    Architect => [3],
    Accountant => [4, 11],
    Baker => [2],
    Actress => [7],
    Chef => [11],
    Butcher => [10, 8],
    Carpenter => [8, 7, 1]
]
您可以为相同的用户设置:

$data = UsersPosition::selectRaw("position, GROUP_CONCAT('user_id')")
->groupBy('position')
->get();
您可以为相同的用户设置:

$data = UsersPosition::selectRaw("position, GROUP_CONCAT('user_id')")
->groupBy('position')
->get();
试试这个:

$data = UsersPosition::selectRaw("position, GROUP_CONCAT('user_id')")
                     ->groupBy('position')
                     ->get();
试试这个:

$data = UsersPosition::selectRaw("position, GROUP_CONCAT('user_id')")
                     ->groupBy('position')
                     ->get();

由于mysql不能为您提供关联数组,您应该使用GROUP_CONCAT函数。 如果您有user,例如$user=Auth::user,并且您获得$user->positions,那么您将获得一个用户的所有位置

如果要获取每个位置的分组数据,应运行以下代码:

UserPosition::query ->选择raw' 位置 作为用户的组\u concatuer\u id ' ->groupBy'user\u id' ->得到 ->映射函数$val{ $val->users=分解“,”,$val->users; } ->删除“用户”、“位置” ->托雷;
你会得到你想要的数组

,因为mysql不能为你提供关联数组,你应该使用GROUP_CONCAT函数。 如果您有user,例如$user=Auth::user,并且您获得$user->positions,那么您将获得一个用户的所有位置

如果要获取每个位置的分组数据,应运行以下代码:

UserPosition::query ->选择raw' 位置 作为用户的组\u concatuer\u id ' ->groupBy'user\u id' ->得到 ->映射函数$val{ $val->users=分解“,”,$val->users; } ->删除“用户”、“位置” ->托雷;
你会得到你想要的数组

你在寻找一种多对多的关系。如果按照使用中间透视表,则可以轻松地反转查找

现在,用户有很多位置,但由于位置在辅助表中重复,因此没有结构可以轻松地将所有用户置于某个位置


如果使用中间表,您可以让用户拥有位置,而位置拥有用户,这将为您提供分组,还可以减少位置名称的数据重复。

您正在寻找多对多关系。如果按照使用中间透视表,则可以轻松地反转查找

现在,用户有很多位置,但由于位置在辅助表中重复,因此没有结构可以轻松地将所有用户置于某个位置


如果使用中间表,您可以让用户拥有位置,而位置拥有用户,这将为您提供分组,还可以减少位置名称的数据重复。

我喜欢Sehdev的答案,但为了获得所需的键,您可以尝试对生成的Eloquent\Collection进行操作

UserPosition::where(...)->get()
    ->groupBy('position')->map(function (array $groupedPositions) {
        return collect($groupedPositions)->pluck('id');
    });

这有点不同,因为只要调用get,您就在与一个集合对象而不是查询\Builder对象交谈。这意味着后续的groupBy调用与过滤查询结果的调用不同,而是嵌套查询结果。这使map方法能够访问以您描述的方式组织它所需的所有数据。

我喜欢Sehdev的答案,但为了获得所需的密钥,您可以尝试对生成的elount\Collection进行操作

UserPosition::where(...)->get()
    ->groupBy('position')->map(function (array $groupedPositions) {
        return collect($groupedPositions)->pluck('id');
    });
这有点不同,因为只要调用get,您就在与一个集合对象而不是查询\Builder对象交谈。这意味着后续的groupBy调用与过滤查询结果的调用不同,而是嵌套查询结果。这使map方法能够访问以您描述的方式组织它所需的所有数据