O que é a hidratação da Doutrina? [fechadas]

90

Eu li sobre hidratação na documentação da doutrina, mas ainda não consigo entender o que é.

Alguém poderia explicar?

never_had_a_name
fonte
Referência da documentação do Doctrine2 explicando HIDRATAÇÃO: doctrine-project.org/docs/orm/2.0/en/reference/…
Dawid Ohia
29
Não é construtivo? Este é um dos conceitos mais fundamentais para entender como funcionam os internos do Doctrine.
csvan
6
Acho que essa questão deve ser protegida em vez de encerrada.
Simon
2
@Simon Agree. A pergunta e a resposta aceita são ambas populares, por que não movê-la para um estado protegido então?
Denis Kulagin

Respostas:

92

Hidratação é um método usado para retornar os resultados da consulta. Por exemplo:

  1. HYDRATE_ARRAY - Isso retornará uma matriz de registros que são representados por outra 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- Isso irá retornar uma coleção ( 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 - Retornará o valor da primeira coluna do resultado da consulta:

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

Existem mais alguns métodos, você pode ler sobre cada um na documentação.

Crozin
fonte
ok .. normalmente quando eu uso sql ele retorna um objeto mysql e eu tenho que usar mysqli_fetch_assoc, então classificá-los por mim mesmo e assim por diante ... mas agora está tudo classificado para mim. é disso que trata a hidratação, me dando objetos / matrizes ordenados?
never_had_a_name de
4
Não, não se trata de classificar o resultado ( orderBy()lidar com isso). É sobre Qual será o resultado da sua consulta , se será um único valor escalar ( HYDRATE_SINGULAR_SCALAR), um array ou arrays onde os arrays aninhados representam cada registro do banco de dados ( HYDRATE_ARRAY) ou uma coleção de objetos ( HYDRATE_RECORD). Faça var_dump no resultado da consulta para cada modo de hidratação - essa é a melhor maneira de ver "como funciona?"
Crozin
4
apenas uma pequena dica. Em 1.2 HYDRATE_SINGULAR_SCALARretorna um erro constante indefinido. HYDRATE_SINGLE_SCALARestá certo.
Darmen Amanbayev
1
Como uma nota Doctrine::HYDRATE_RECORDagora é conhecido comoDoctrine::HYDRATE_OBJECT
Steve Tauber
1
Um link para a documentação mencionada tornaria esta resposta mais útil.
Sean the Bean
2
$q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);

Ele retornará apenas um array simples em vez de um objeto de coleção de doutrina.

Jubayer Arefin
fonte