2016-05-19 5 views
-1

Laravel 5.2でコレクションをフラット化して、リンクされたテーブルのすべての一意の値を単一の行に表示しようとしています。私は3つのテーブル、ユーザー、組織、およびリンクテーブルであるUser_organisationを持っています。ユーザーは複数の組織に所属することができます。行内のunqiueキーをリストするLaravelコレクションをフラット化

参加するとき、私は、次の

"id" "name" "surname" "email"    "organisation" 
"2001" "Jim" "Tester1" "[email protected]" "ABC" 
"2001" "Jim" "Tester1" "[email protected]" "XYZ" 
"2001" "Jim" "Tester1" "[email protected]" "123" 
"2004" "Bob" "Smith"  "[email protected]" "ABC" 
"2004" "Bob" "Smith"  "[email protected]" "MNO" 
"2006" "Tom" "Foo"  "[email protected]" "MNO" 

を取得しかし、私は次のようにこれを変換したい:自分の組織を一覧表示する各ユーザーのための単一の行。列がそうのように並ぶ場合

"2001" "Jim" "Tester1" "[email protected]" "ABC", "XYZ", "123" 
"2004" "Bob" "Smith"  "[email protected]" "ABC", "MNO" 
"2006" "Tom" "Foo"  "[email protected]" "MNO" 

それも、よりよい次のようになります。これは、SQLまたはPHPで行われている場合、私は気にしない

"2001" "Jim" "Tester1" "[email protected]" "ABC", "XYZ", "123",  
"2004" "Bob" "Smith"  "[email protected]" "ABC",  ,  , "MNO" 
"2006" "Tom" "Foo"  "[email protected]"  ,  ,  , "MNO" 

。私はたくさんのループを使うのを避けようとしており、コレクションメソッドを使用した洗練されたソリューションを望んでいました。

+0

なぜSQLを書かないのですか? – marko

+0

'SELECT GROUP_CONCAT(組織)...グループIDによって'? – eggyal

答えて

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; 

ドキュメントはあなたの友達です。

EDIT

ところで、それはあなたのコードの任意の部分を見ることなく優れたソリューションを提案することは容易ではありません。

$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(); 
+1

FWIW、 ''、''は 'GROUP_CONCAT'のデフォルトセパレータです。追加スペースが必要な場合は明示的に指定するだけです。 – eggyal

+0

Laravelクエリービルダーの追加例 – Arcesilas

+0

華麗な、ありがとう。 –

関連する問題