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
...
它不是您想要的形式(不确定您能否得到那种形式),但我认为它的用途相同。
我做了这个查询:
$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
...
它不是您想要的形式(不确定您能否得到那种形式),但我认为它的用途相同。