2017-08-07 1 views
2
$qb = $this->createQueryBuilder('u') 
     ->select('u.id, u.name, c.category') 
     ->innerJoin('u.categories', 'c') 
     ->where('u.id = (:user)') 
     ->setParameter('user', $user) 
     ->getQuery() 
     ->execute(); 

で結果を参加して、私はいつもこのような結果を得る:マージは、1列

Array[0] = 'id' -> 1, 'name' -> john, 'category' -> A 
Array[1] = 'id' -> 1, 'name' -> john, 'category' -> B 
Array[2] = 'id' -> 1, 'name' -> john, 'category' -> C 

そして、私はこれを取得したい:

Array[0] = 'id' -> 1, 'name' -> john, 'category' -> [A,B,C] 

私はu.idすることにより、グループを使用している場合、私はonleを最初のカテゴリで最初のArray [0]を取得し、私は他の2つのカテゴリを失った。

このクエリを実行するにはどうすればよいですか?

ありがとうございます!

答えて

3

SQLクエリ

SELECT 
    id 
    , name 
    , GROUP_CONCAT(category) AS categories 
FROM 
    [table] 
GROUP BY 
    id 
    , name 

教義コード

教義のコードは次のようなものでなければなりません。

$qb = $this->createQueryBuilder('u') 
     ->select('u.id, u.name', DB::raw('GROUP_CONCAT(category) AS categories')) 
     ->innerJoin('u.categories', 'c') 
     ->where('u.id = (:user)') 
     ->groupBy('u.id', 'u.name') 
     ->setParameter('user', $user) 
     ->getQuery() 
     ->execute(); 
+0

おかげで、これは罰金:) もう一つ、私は 'カテゴリ' を得るに動作します - > [猫A、猫のB ...]のようなものを取得することが可能であろう: 'カテゴリ' を - > [配列(catA、catB)]こうして私はこれらのカテゴリを別々に得ることができたからです。 – user3396420

+0

@ user3396420これは可能ですが、doctrineではできません。結果をループし、カテゴリの区切り文字 '、'で関数explodeを使用して配列を作成し、その出力をどこかに保存する必要があります。 –

-1

MySqlマニュアルのgroup_concatを参照してください。

$sql = "SELECT u.id, u.name, GROUP_CONCAT(c.category SEPARATOR ',') 
     FROM table_name u 
     INNER JOIN categories table c ON (your conditions) 
     WHERE u.id = ($user) 
     GROUP BY c.category"; 

$em = $this->getDoctrine()->getEntityManager(); 
$em->createQuery($sql); 
$em->execute(); 
関連する問題