首页 文章

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

提问于
浏览
2

我做了这个查询:

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

这个查询返回给我这个表:

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有可能吗?还是有些循环?谢谢你的帮助

2 回答

  • 0

    如果在实体之间 Build 关系会好得多 . 这样,Doctrine会为您处理这些问题 .

    例如,如果您有两个实体AVCMediasBundle:语言和AVCMediasBundle:国家,您可以 Build 他们之间的关系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
        ...
    

    它并不完全是你想要的形式(不确定你能得到那种形式),但我认为它有同样的目的 .

  • 1

    你可以用简单的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;
    }
    

相关问题