Doctrine 2: Query result as associative array

前端 未结 5 1396
傲寒
傲寒 2020-12-29 05:58

In my Repository class I use the following code to query:

$query = $this->getEntityManager()->createQuery(\"
    SELECT s.term, COUNT(s.term) AS freq
          


        
相关标签:
5条回答
  • 2020-12-29 06:32

    After lot of search I have found some solutions for doctrine object to array conversion. When we have associated objects in result.

    1.

    $person = $em->find('Person', 2);
    $da = array();
            $person = (array) $person;
            foreach($person as $i=>$d) {
                if (is_object($d)) {
                    $d = (array) $d;
                    foreach($d as $si=>$sd){
                        if (is_object($sd)) {
                            //var_dump('after convert array');
                            $da[$i][$si] = (array) $sd ;
                             //var_dump($da[$i][$si]);
                        } else {
                           $da[$i][$si] = $sd ;
                           //var_dump($da[$i][$si] );
                        }
                    }
    
                } else {
                    $da[$i] = $d;
                    //var_dump($da[$i]);
                }
            }
    
    echo '<pre>'; print_r($da); echo '<pre>'; exit;
    

    2.

    $query = $em->createQuery('SELECT w FROM  Person w WHERE w.Id = 2');
    $person = $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    echo '<pre>';  \Doctrine\Common\Util\Debug::dump($person); exit;
    

    3.

     $result = $em->createQueryBuilder();
                $person = $result->select('p')
                ->from('PsnPersonPsn', 'p')
                ->where('p.Id= 1')
                ->getQuery()
                ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
                 echo '<pre>';  \Doctrine\Common\Util\Debug::dump($person); exit;
    
    0 讨论(0)
  • 2020-12-29 06:33

    Use INDEX BY :

    $em = $this->getEntityManager();
    $query = $em->createQuery('SELECT c FROM SomeBundle:Configuration c INDEX BY c.name');
    $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    

    I saw it here and it works fine : https://coderwall.com/p/crz4dq/defining-a-column-to-be-the-key-of-the-result-hydrated-as-array-in-doctrine-2

    0 讨论(0)
  • If you want an array you can use the getArrayResult method.

    Gets the array of results for the query.

    Alias for execute(null, HYDRATE_ARRAY).

    $result = $query->getQuery()->getArrayResult();
    

    So using this method will give you the exact same result as using the constant HYDRATE_ARRAY.

    0 讨论(0)
  • 2020-12-29 06:39

    Actually somewhere the transposition has to be done. See Hydration Modes about what is returned by ->getResult() and which alternatives modes/variants already exist.

    You can also add your own hydration mode at a central place. That is explained in Custom Hydration Modes.

    0 讨论(0)
  • 2020-12-29 06:47

    I know its old but today I had to do almost the same, my solution without a custom hydrator

    • INDEX BY s.term
    • modify the getResult() to be sure

    like

    $result = $query->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
    
    • format the result

    as

    $resultNeeded = array_map(function($value) { return $value['freq']; }, $result);
    
    0 讨论(0)
提交回复
热议问题