Symfony - Doctrine - DQL - 创建数组对象

Symfony - Doctrine - DQL - Create Array Object

我做了这个查询:

$language = $this->getDoctrine()->getManager()
->createQuery('SELECT c FROM AVCMediasBundle:Language c WHERE c.LangCode IS NOT NULL ORDER BY c.LanguageName')
->getResult();

这个查询 returns 我这个 table :

id    langCode   languageName   countryName       ...
1       en          english       England          ...
2       en          english       United States     ...
3       en          english       Australia        ...
4       es          spanish       Spain            ...
5       es          spanish       Mexico           ...
6       es          spanish       Argentina        ...

我的树枝上有一个 {{ dump }},我明白了:

array:6 [
   0 => Langue {
    -id: 15
    -langCode: "en"
    -languageName: "English"
    -countryName: "England"
    }
    1 => Langue {
    -id: 1
    -langCode: "en"
    -languageName: "English"
    -countryName: "United States"}
    2 => Langue {
    -id: 3
    -langCode: "en"
    -languageName: "English"
    -countryName: "Australia"
    }
    3 => Langue {
    -id: 6
    -langCode: "es"
    -languageName: "Spanish"
    -countryName: "Spain"
    }
    4 => Langue {
    -id: 9
    -langCode: "es"
    -languageName: "Spanish"
    -countryName: "Mexico"
    }
    5 => Langue {
    -id: 2
    -langCode: "es"
    -languageName: "Spanish"
    -countryName: "Argentina"
    }
]

我现在需要的是对 countryName 具有相同 languageName 的每个实体进行分组 我怎样才能做一个这样的对象数组:

Array [
    0 => English
        Entity Langue
            => England
                -id: 15
                -langCode: "en"
                -languageName: "English"
                -countryName: "England"
            => United States
                -id: 1
                -langCode: "en"
                -languageName: "English"
                -countryName: "United States"}
            => Australia
                ...
    1 => Spanish
        Entity Langue
            => Spain
                -id: 6
                -langCode: "es"
                -languageName: "Spanish"
                -countryName: "Spain"
            => Mexico
                -id: 9
                -langCode: "es"
                -languageName: "Spanish"
                -countryName: "Mexico"
            => Australia
                ...
]

DQL 可以吗?或者有一些循环? 感谢您的帮助

您可以使用简单的 foreach 循环来完成

$grouped = [];
foreach ($language as $item) {
    //i assume that every array element has `languageName`attribute 
    //and country names  not repeated
    //otherwise, you should check it out
    $grouped[$item['languageName']][$item['countryName']] = $item;
}

如果能建立实体之间的关系就更好了。这样 Doctrine 就会为你处理这些类型的查询。

例如,如果您有两个实体 AVCMediasBundle:Language 和 AVCMediasBundle:Country,您可以在它们之间建立关系 oneToMany(语言有多个国家和一个国家的一种语言)并使用一种语言访问这些国家轻松使用适当的 getter。当然,这只是一个示例,您的应用程序和关系可能比所提供的复杂得多。有关关系的更多信息 here

如果这不是一个选项,循环应该可以解决问题:

$res = array();
foreach ($language as $item) {
    $keyLanguage = $item->getLanguageName();// Change the getter if it's not correct
    $keyCountry = $item->getCountryName();// Change the getter if it's not correct
    $res[$key][$keyCountry] = $item;
}

它会给你类似的东西

array (
    "English" => array(
         "England" => object England,
         "United States" => object United States
    ...

它不是您想要的形式(不确定您能否得到那种形式),但我认为它的用途相同。