web-dev-qa-db-fra.com

Comment obtenir des résultats de tableau dans findAll () - Doctrine?

J'ai besoin de récupérer tous les enregistrements de la base de données en tant que tableau à l'aide de findAll() dans Doctrine, Ma requête est quelque chose comme ça

$result = $this->getDoctrine()
                ->getRepository('CoreBundle:Categories')
                ->findAll(\Doctrine\ORM\Query::HYDRATE_ARRAY);

même si le mode d'hydratation est réglé sur HYDRATE_ARRAY, j'obtiens des résultats en tant qu'objets

array:4 [▼
0 => Categories {#323 ▶}
1 => Categories {#326 ▶}
2 => Categories {#329 ▶}
3 => Categories {#332 ▶}
]

quelle erreur j'ai fait?

6
HariHaraSudhan

La méthode findAll() n'a pas de paramètres. Vous pouvez, par exemple, utiliser la méthode createQueryBuilder() du référentiel pour réaliser ce que vous voulez faire:

use Doctrine\ORM\Query;

// ...

$query = $this->getDoctrine()
    ->getRepository('CoreBundle:Categories')
    ->createQueryBuilder('c')
    ->getQuery();
$result = $query->getResult(Query::HYDRATE_ARRAY);
12
xabbuh

Il est possible d'utiliser $query->getArrayResult() comme raccourci vers $query->getResult(Query::HYDRATE_ARRAY)

modes d'hydratation de la doctrine

4
Pascal KOCH

J'ai fait cette fonction:

https://Gist.github.com/AndreiLN/3708ab829c26cee4711b1df551d1385f

/** 
 * Converte um objeto Doctrine para um array
 * @param $dados
 * @param $single define se é uma única execução (Sem recursividade)
 * @return array
*/
public function doctrine_to_array($data, $single = false) {
    if (is_object($data)) { // Verifica se é array ou objeto
        $methods = get_class_methods($data);
        $methods = array_filter($methods, function($val){ return preg_match('/^get/', $val); });

        $return = [];
        if(count($methods)){
            foreach($methods as $method){
                $prop = lcfirst(preg_replace('/^get/', "", $method));
                $val = $data->$method();

                if(!$single){
                    $return[$prop] = $this->doctrine_to_array($val, $single);
                } else {
                    if(!is_array($val) && !is_object($val)){
                        $return[$prop] = $val;
                    }
                }
            }
        }
        return $return;
    } else if(is_array($data)){
        if(count($data)){
            foreach($data as $idx => $val){
                $data[$idx] = $this->doctrine_to_array($val, $single);
            }
        }
    }
    return $data; // Retorna o próprio valor se não for objeto
}

Si vous trouvez une mise à niveau, faites-le moi savoir.

Expliquer plus de cette fonction: c'est obtenir l'objet doctrine du tableau, si c'est un objet, il lit toutes les méthodes de get pour obtenir toutes les valeurs, si ces valeurs sont un autre objet doctrine (Et une seule option n'est pas définie ) c'est appeler la fonction récursivement jusqu'à ce qu'elle soit terminée. Si le paramètre est un tableau, la fonction le parcourra et appellera à nouveau la méthode pour toutes ses valeurs.

Il est facile à utiliser, mais pas testé dans toutes les situations.

0
Andrei Luiz Nenevê

Le format dans lequel le résultat d'une requête DQL SELECT est renvoyé peut être influencé par un soi-disant hydration mode Donc vous ne pouvez pas l'utiliser pour findAll(). Vous pouvez essayer ceci ci-dessous:

$em = $this->getDoctrine()->getManager();
$result = $em->createQuery('select m from CoreBundle:Categories m')
        ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
0
yang