2017-08-07 118 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(); 

結果,我總是得到這樣的結果:合併聯接在一個陣列

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得到第一個數組[0]與第一個類別,我失去了另外兩個類別。

我該如何做這個查詢?

謝謝!

回答

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它是可能的,但不符合教義。你需要循環結果並使用分隔符','爆炸分類符,以創建一個數組..並將該輸出保存在某處。 –

-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();