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方法能够访问以您描述的方式组织它所需的所有数据