展平Laravel集合以连续列出unqiue键

时间:2016-05-19 18:19:58

标签: php mysql join laravel-5

我正在尝试在Laravel 5.2中展平一个集合,以便在一行中显示链接表中的所有唯一值。我有三个表,用户,组织和User_organisation这是一个链接表。用户可以属于多个组织。

加入时,我会得到以下内容

"id"    "name"  "surname"   "email"             "organisation"
"2001"  "Jim"   "Tester1"   "jim@example.com"   "ABC"
"2001"  "Jim"   "Tester1"   "jim@example.com"   "XYZ"
"2001"  "Jim"   "Tester1"   "jim@example.com"   "123"
"2004"  "Bob"   "Smith"     "bob@example.com"   "ABC"
"2004"  "Bob"   "Smith"     "bob@example.com"   "MNO"
"2006"  "Tom"   "Foo"       "tom@example.com"   "MNO"

但我想将其转换为以下内容:每个用户列出其组织的单行。

"2001"  "Jim"   "Tester1"   "jim@example.com"   "ABC", "XYZ", "123" 
"2004"  "Bob"   "Smith"     "bob@example.com"   "ABC", "MNO"
"2006"  "Tom"   "Foo"       "tom@example.com"   "MNO"

如果列如此对齐,那就更好了:

"2001"  "Jim"   "Tester1"   "jim@example.com"   "ABC", "XYZ", "123",    
"2004"  "Bob"   "Smith"     "bob@example.com"   "ABC",      ,      , "MNO"
"2006"  "Tom"   "Foo"       "tom@example.com"        ,      ,      , "MNO"

我不介意这是用SQL还是用php完成的。我试图避免使用大量的循环,并希望使用收集方法的优雅解决方案。

1 个答案:

答案 0 :(得分:1)

您需要GROUP BY您的搜索结果:

SELECT foo, bar, baz FROM table GROUP BY id;

您还需要使用aggregate functions来处理不同列的值:

SELECT GROUP_CONCAT(organisation SEPARATOR ", "), foo, bar FROM table GROUP BY id;

文档是你的朋友。

修改

顺便说一句,如果没有看到代码的任何部分,提出好的解决方案并不容易。

$select = [
    'col1', 'col2', etc,
    DB::raw('GROUP_CONCAT(organisation SEPARATOR ", ")')
];

$whatyouwant = DB::select($select)
    ->from('yourtable')
    ->groupBy('id')
    ->orderBy('someColumn', 'ASC')
    // Some more logic you need
    ->get();