Récupération données et hydratation

6330
,

Bonjour à tous,

Je débute dans Symfony
Actuellement je réalise un site sous Symfony 3 pour ma compagne afin de gérer ses contrats d'assistante maternelle.

j'ai un table pour les enfants et une table pour les fiches de paies.

sur le détails d'un enfant je veut lister toute ses fiches de paies groupés par dates.

Avant d'utilisé Symfony je faisait un fetchAll(PDO::FETCH_GROUP|PDO::FETCH_OBJ) pour obtenir un tableau ressemblant à celui-ci :

[
2016 => [ObjectFiche_1, ..., ObjectFiche_n],
2017 => [ObjectFiche_1, ..., ObjectFiche_n]
]

Voici ma requête dans mon repository :

<?php
public function getBulletinsByEnfant($enfant) {
  $query = $this->createQueryBuilder('b')
    ->select('YEAR(b.date), b')
    ->innerJoin('b.enfant', 'e')
    ->addSelect('e')
    ->orderBy('e.nom, b.date', 'DESC')
    ->where('e.id = :id')
    ->setParameter('id', $enfant)
    ->orderBy('b.date')
    ->getQuery()
    ->getResult('FetchGroup');

  return $query;
}

Pour récupérer les données via un fetch_group j'ai du créer ma class d'hydratation :

<?php
namespace AppBundle\Hydrators;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator;
use PDO;

class FetchGroupHydrators extends AbstractHydrator {

  /**
   * Hydrates all rows from the current statement instance at once.
   *
   * @return array
   */
  protected function hydrateAllData() {
    return $this->_stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_OBJ);
  }
}

le problème c'est j'obtiens bien un tableau correctement formé avec comme index l'année. Mais le tableau correspondant à l'année me retourne un tableau des données au lieu d'une occurence de mon entitée.

Est-ce que ma méthodologie est bonne; et comment puis-je obtenir un tableau d'entitées

Merci
Couss

3 Réponse

6330
, Il a répondu à ma question !

Up please

12066
, Il a répondu à ma question !

Quand tu retournes ta query ndas ton repository, affectes le retour à une variable.
faire un dump($variable);
Dans ton profiler tu dois avoir un objet.
Regardes si il correspond

6330
, Il a répondu à ma question !

Bonjour,

Merci de ta réponse.
Si jutilise mon hydrator custom j'obtiens :

array:2 [▼
  2016 => array:1 [▼
    0 => {#411 ▶}
  ]
  2017 => array:2 [▼
    0 => {#410 ▶}
    1 => {#407 ▶}
  ]
]

avec l'hydrator par defaut :

array:3 [▼
  0 => array:2 [▼
    0 => Bulletin {#449 ▶}
    "date" => "2016"
  ]
  1 => array:2 [▼
    0 => Bulletin {#455 ▶}
    "date" => "2017"
  ]
  2 => array:2 [▼
    0 => Bulletin {#446 ▶}
    "date" => "2017"
  ]
]

Pour le moment j'ai contourné le problème en créant moi même le tableau via le repository :

public function getBulletinsByEnfantTmp($enfant) {
    $result = [];
        $rows = $this->createQueryBuilder('b')
            ->select('YEAR(b.date), b')
            ->innerJoin('b.enfant', 'e')
            ->addSelect('e')
            ->orderBy('e.nom, b.date', 'DESC')
            ->where('e.id = :id')
            ->setParameter('id', $enfant)
            ->orderBy('b.date')
            ->getQuery()
            ->getResult();

    foreach ($rows as $row) {
      if(!array_key_exists($row[1], $result)) {
        $result[$row[1]] = [];
      }
      $result[$row[1]][] = $row[0];
    }

        return $result;
    }

Mais je reste sur qu'il y a une meilleur solution et surement que je m'y prend mal.
Le plus étrange c'est que apperement personne n'as jamais eu a faire de PDO::FETCH_GROUP via SF