簡體   English   中英

學說水合陣列結果

[英]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 BYJOIN在於,該學說給您的結果可能不包含從數據庫中獲取的所有數據。

在您的情況下,數據庫可能會返回包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM