我正在尝试在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完成的。我试图避免使用大量的循环,并希望使用收集方法的优雅解决方案。
答案 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();