2010-04-18 17 views
83

He leído sobre la hidratación en la documentación de la doctrina, pero todavía no puedo entender de qué se trata.¿Qué es la hidratación de Doctrine?

¿Podría alguien explicar?

+24

constructiva? Este es uno de los conceptos más fundamentales para entender cómo funcionan las funciones internas de Doctrine. – csvan

+5

Creo que esta pregunta debe estar protegida en lugar de cerrada. – Simon

+1

@Simon De acuerdo. La pregunta y la respuesta aceptada son ambas populares, ¿por qué no moverlo a _protected_ state entonces? –

Respuesta

87

La hidratación es un método utilizado para devolver los resultados de la consulta. Por ejemplo:

  1. HYDRATE_ARRAY - Esto le devolverá una matriz de registros que están representados por otra matriz:

    $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 - Esto le devolverá una colección (Doctrine_Collection) de objetos:

    $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 - Devolverá el valor de la primera columna de la consulta de r esultado:

    $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) 
    

Hay unos cuantos métodos, se puede leer acerca de cada uno en la documentación.

+0

ok..soy normalmente cuando uso sql devuelve un objeto mysql y tengo que usar mysqli_fetch_assoc, luego ordenarlos por mí mismo y así sucesivamente ... pero ahora está todo arreglado para mí. ¿De eso se trata la hidratación, dándome objetos ordenados/matrices? –

+4

No, no se trata de clasificar el resultado ('orderBy()' manejar esto). Se trata de * ¿Cuál será el resultado de su consulta *, ya sea un valor escalar único ('HYDRATE_SINGULAR_SCALAR'), una matriz o matrices donde las matrices anidadas representan cada registro de la base de datos (' HYDRATE_ARRAY') o una colección de objetos ('HYDRATE_RECORD') Haga [var_dump] (http://pl.php.net/manual/en/function.var-dump.php) en el resultado de la consulta para cada modo de hidratación: ¿esa es la mejor manera de ver "cómo funciona?" – Crozin

+0

aha..i creo que lo entiendo ahora. así que se trata de en qué forma quiero que esté el resultado: valor escalar, matrices u objetos. eso suena como una muy buena característica. de lo que no tengo que convertirlos yo mismo de mysqli_object :) –

3
$q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY); 

It will return just a simple array instead of a doctrine collection object. 
No