Qu'est-ce que l'hydratation Doctrine? [fermé]

90

J'ai lu sur l'hydratation dans la documentation de la doctrine, mais je ne comprends toujours pas ce que c'est.

Quelqu'un pourrait-il expliquer?

never_had_a_name
la source
Référence de documentation Doctrine2 expliquant HYDRATION: doctrine-project.org/docs/orm/2.0/en/reference/...
Dawid Ohia
29
Pas constructif? C'est l'un des concepts les plus fondamentaux pour comprendre le fonctionnement des internes de la Doctrine.
csvan
6
Je pense que cette question devrait être protégée plutôt que fermée.
Simon
2
@Simon D'accord. La question et la réponse acceptée sont toutes deux populaires, pourquoi ne pas la déplacer dans un état protégé alors?
Denis Kulagin

Réponses:

92

L'hydratation est une méthode utilisée pour renvoyer les résultats de la requête. Par exemple:

  1. HYDRATE_ARRAY - Cela vous retournera un tableau d'enregistrements qui sont représentés par un autre tableau:

    $q = Doctrine_Query::create()
       ->from('Post p')
       ->setHydrationMode(Doctrine::HYDRATE_ARRAY);
    
    $resultSet = $q->execute(); // $resultSet is an array
    
    foreach ($resultSet as $post) {
        // $post is an array
        echo $post['title'];
    }
  2. HYDRATE_RECORD- Cela vous retournera une collection ( Doctrine_Collection ) d'objets:

    $q = Doctrine_Query::create()
       ->from('Post p')
       ->setHydrationMode(Doctrine::HYDRATE_RECORD); // Unnecessary, HYDATE_RECORD is default method
    
    $resultSet = $q->execute(); // $resultSet is an Doctrine_Collection object
    
    foreach ($resultSet as $post) {
        // $post is an Post object
        echo $post->getTitle();
        echo $post['title']; // Each Doctrine's Model object implements ArrayAccess interface so this is possible
        echo $post->myCustomMethod();
    }
  3. HYDRATE_SINGULAR_SCALAR - Renvoie la valeur de la première colonne du résultat de la requête:

     $q = Doctrine_Query::create()
       ->select('p.created_at')
       ->from('Post p')
       ->where('p.id = ?', 321)
       ->setHydrationMode(Doctrine::HYDRATE_SINGULAR_SCALAR); 
    
    $createdAt = $q->execute(); // $createdAt has value of first column from first record from result set (eg.: 2008-04-06 21:22:35)

Il existe quelques méthodes supplémentaires, vous pouvez en savoir plus sur chacune dans la documentation.

Crozin
la source
ok .. donc normalement quand j'utilise sql, il retourne un objet mysql et je dois utiliser mysqli_fetch_assoc, puis les trier moi-même et ainsi de suite ... mais maintenant tout est trié pour moi. c'est ça l'hydratation, me donnant des objets / tableaux triés?
never_had_a_name
4
Non, il ne s'agit pas de trier les résultats ( orderBy()gérer cela). Il s'agit de savoir quel sera le résultat de votre requête , qu'il s'agisse d'une seule valeur scalaire ( HYDRATE_SINGULAR_SCALAR), d'un tableau ou de tableaux où les tableaux imbriqués représentent chaque enregistrement de base de données ( HYDRATE_ARRAY) ou une collection d'objets ( HYDRATE_RECORD). Faites var_dump le résultat de la requête pour chaque mode d'hydratation - « comment ça marche » qui est la meilleure façon de voir
Crozin
4
juste un petit conseil. In 1.2 HYDRATE_SINGULAR_SCALARrenvoie une erreur constante non définie. HYDRATE_SINGLE_SCALARest correct.
Darmen Amanbayev
1
Comme une note Doctrine::HYDRATE_RECORDest maintenant connue sous le nom deDoctrine::HYDRATE_OBJECT
Steve Tauber
1
Un lien vers la documentation susmentionnée rendrait cette réponse plus utile.
Sean the Bean
2
$q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);

Il renverra juste un simple tableau au lieu d'un objet de collection doctrine.

Jubayer Arefin
la source