[英]Doctrine hydrated array result
我想讓Doctrine返回一個水合的數組,其值是鍵的id,然后返回結果數組中的所有值(即,如果有多個具有相同ID的項目,則在數組中返回具有多個結果的ID)。
這是我目前執行的功能:
public static function getMedia($em, $entity, $id = NULL)
{
$dql = 'SELECT m.id, m.url, m.nb, m.lang
FROM iMT\Entity\Media m INDEX BY m.id JOIN iMT\Entity\\' . $entity . ' r WITH m.id = r.id';
if($id) {
$dql .= " WHERE r.id = ?1";
}
$q = $em->createQuery($dql);
if($id) {
$q->setParameter(1, $id);
}
return $q->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
}
哪個返回:
array (size=44)
479600 =>
array (size=4)
'id' => int 479600
'url' => string 'pois/479600/Nonna.JPG' (length=48)
'nb' => null
'lang' => string 'fr' (length=2)
479615 =>
array (size=4)
'id' => int 479615
'url' => string 'pois/479615/Tramways.jpg' (length=51)
'nb' => null
'lang' => string 'fr' (length=2)
479580 =>
array (size=4)
'id' => int 479580
'url' => string 'pois/479580/ATLAS.jpg' (length=48)
'nb' => null
'lang' => string 'fr' (length=2)
479581 =>
array (size=4)
'id' => int 479581
'url' => string 'pois/479581/P'tit_sushi.jpg' (length=54)
'nb' => null
'lang' => string 'fr' (length=2)
但是,我需要的輸出是:
array (size=44)
479600 =>
array (size=2)
array (size=4)
'id' => int 479600
'url' => string 'pois/479600/Nonna.JPG' (length=48)
'nb' => null
'lang' => string 'fr' (length=2)
array (size=4)
'id' => int 479600
'url' => string 'pois/479600/OtherPic.JPG' (length=48)
'nb' => null
'lang' => string 'fr' (length=2)
我需要創建自己的AbstractQuery :: HYDRATE_ARRAY還是有可用的東西滿足我的需要?
我通過檢查結果是否包含與當前項目的ID匹配的鍵來使用結果(例如if(isset($ data [$ item]))// // $ item = 479600然后輸出圖像),也許有一個更好的方法來檢查結果?
編輯
我更新了函數以返回:
$result = $q->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
$data = array();
$count = count($result);
for($i = 0; $i < $count; $i++) {
if(!isset($data[$result[$i]['id']])) {
$data[$result[$i]['id']] = array(
$result[$i]
);
} else {
$data[$result[$i]['id']][] = $result[$i];
}
}
return $data;
這返回了更多我想要的東西:
array (size=44)
479600 =>
array (size=1)
0 =>
array (size=4)
'id' => int 479600
'url' => string 'pois/479600/Nonna.JPG' (length=48)
'nb' => null
'lang' => string 'fr' (length=2)
479577 =>
array (size=2)
0 =>
array (size=4)
'id' => int 479577
'url' => string 'pois/479577/AOMC.JPG' (length=47)
'nb' => null
'lang' => string 'fr' (length=2)
1 =>
array (size=4)
'id' => int 479577
'url' => string 'pois/479577/Buffet AOMC.jpg' (length=54)
'nb' => null
'lang' => string 'fr' (length=2)
這可以改善嗎? 是否有任何教義函數可以提供幫助,還是我應該離開for()
循環?
結合使用INDEX BY
和JOIN
在於,該學說給您的結果可能不包含從數據庫中獲取的所有數據。
在您的情況下,數據庫可能會返回包含m.id
相同值的多行(因為JOIN
)。 但是,每一個包含相同m.id
值的后續行都將覆蓋前一行(因為INDEX BY m.id
)。
Doctrine 並未配備可以解決此問題的水合器。 您確實需要實現自己的。 閱讀有關創建自定義水合模式的更多信息。
替代
另一個解決方案是在這種情況下不使用INDEX BY
。
您可以編寫一個存儲庫方法,以將Doctrine給出的結果轉換為所需的數組。 然后,應用程序的其他部分可以調用該存儲庫方法。
這可能比創建自定義水合作用模式容易。
更新
翻譯看起來像這樣:
$data = array();
foreach ($q->getArrayResult() as $row) {
if (!isset($data[$row['id']])) {
$data[$row['id']] = array();
}
$data[$row['id']][] = $row;
}
return $data;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.