DoctrineのHydrationとは

DoctrineはPDOを使用しています。PDOはSELECT句を実行すると1次元の配列で値が取得できます。この配列をDoctrineのオブジェクト、もしくはオブジェクトと同様に階層化された配列に変換することをDoctrineではHydration(ハイドレーション)と呼んでいます。ちなみにhydrateとは「潤いをあたえる」とかそんな意味だったと思います。

このHydrationはDoctrineのORマッピングの中でもとても重要な部分です。Doctrineの内部にはDoctrine::HYDRAETE_で始まる定数(Hydration mode)が3種類定義されています。

  • HYDRATE_RECORD
    • オブジェクトへのHydration(デフォルト)
  • HYDRATE_ARRAY
    • 階層化された配列へのHydration
  • HYDRATE_NONE
    • そのままの値
    • PDO::FETCH_NUM

クエリを発行する際にこの定数を渡してあげることで、取得する内容を変えることができます。たとえば、

<?php
$resultAsArray = Doctrine_Query::create()->from('User u, u.Friends f')
  ->execute(array(), Doctrine::HYDRATE_ARRAY);

上記のようにexecuteメソッドの第2引数にHydration modeを渡すことで取得する内容を変更することができます。この他にも、

<?php
$query = Doctrine_Query::create()->from('User u, u.Friends f')
  ->setHydrationMode(Doctrine::HYDRATE_ARRAY); // クエリ中で変更

// execute($params, Doctrine::HYDRATE_ARRAY) と同じ
$query->fetchArray($params);

// execute($params, $hydrationMode)->getFirst() とほぼ同じ
$query->fetchOne($params, $hydrationMode)

上記のような形でHydration modeを指定することができます。

実際にHydrationを行っているのはDoctrine_HydratorクラスのhydrateResultSetメソッドになります。非常に複雑なのですが、ここでHydration modeに応じた結果を作成しています。必要に応じてHydrationを使い分けるといいかもしれません。