Что такое доктрина гидратации? [закрыто]

90

Я читал о гидратации в документации к доктрине, но до сих пор не могу понять, что это такое.

Может кто-нибудь объяснить?

never_had_a_name
источник
Ссылка на документацию Doctrine2, объясняющую HYDRATION: doctrine-project.org/docs/orm/2.0/en/reference/…
Давид Ойа
29
Не конструктивно? Это одна из самых фундаментальных концепций для понимания того, как работают внутренние компоненты Doctrine.
csvan 07
6
Я считаю, что этот вопрос нужно защищать, а не закрывать.
Саймон
2
@Simon Согласен. Вопрос и принятый ответ популярны, почему бы тогда не переместить его в защищенное состояние?
Денис Кулагин

Ответы:

92

Гидратация - это метод, используемый для возврата результатов запроса. Например:

  1. HYDRATE_ARRAY - Это вернет вам массив записей, представленных другим массивом:

    $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- Это вернет вам коллекцию ( Doctrine_Collection ) объектов:

    $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 - Вернет значение первого столбца результата запроса:

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

Есть еще несколько методов, о каждом из которых вы можете прочитать в документации.

Crozin
источник
хорошо .. так что обычно, когда я использую sql, он возвращает объект mysql, и мне нужно использовать mysqli_fetch_assoc, затем сортировать их самостоятельно и так далее ... но теперь все отсортировано для меня. вот что такое гидратация, давая мне отсортированные объекты / массивы?
never_had_a_name
4
Нет, дело не в результатах сортировки ( orderBy()справитесь с этим). Речь идет о том, каким будет результат вашего запроса , будь то одно скалярное значение ( HYDRATE_SINGULAR_SCALAR), массив или массивы, где вложенные массивы представляют каждую запись базы данных ( HYDRATE_ARRAY) или коллекцию объектов ( HYDRATE_RECORD). Сделать var_dump для результата запроса для каждого режима гидратации - это лучший способ увидеть, «как это работает?»
Crozin
4
просто небольшой совет. В 1.2 HYDRATE_SINGULAR_SCALARвозвращает неопределенную постоянную ошибку. HYDRATE_SINGLE_SCALARправильно.
Дармен Аманбаев
1
Как примечание Doctrine::HYDRATE_RECORDтеперь известно какDoctrine::HYDRATE_OBJECT
Стив Таубер
1
Ссылка на вышеупомянутую документацию сделает этот ответ более полезным.
Шон Бин
2
$q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);

Он вернет просто простой массив вместо объекта коллекции доктрины.

Джубайер Арефин
источник