んなこたない

ここで取得される結果の$userProfilesには
Doctrineで自動生成されたUserProfileクラスの配列が
入るだろうと思いきや、そうではないというのが問題です。
(この記述ではDoctrineのRecordオブジェクトの配列が格納されます!)

http://www.flatz.jp/archives/1838

1ヶ月前の記事ですが、DoctrineがDISられてる気持ちになったので突っ込みます。

上記の記事ではDoctrine_Query::create()を使うとDoctrine_Record(?)のコレクションが取れてDoctrine_Table#createQuery()を使うと自分で定義したクラスのコレクションが取得できるとのことで。

ではcreateQuery()が何をやっているか見てみましょう。

<?php
class Doctrine_Table extends Doctrine_Configurable implements Countable
{
    public function createQuery($alias = '')
    {
        if ( ! empty($alias)) {
            $alias = ' ' . trim($alias);
        }
        return Doctrine_Query::create($this->_conn)->from($this->getComponentName() . $alias);
    }
}

getComponentName()はモデル名を取得するメソッドです。とまあ見てわかるとおりDoctrine_Query::create()をしているだけなんですね。ちなみにDoctrine_Query::create()の中身はというと

<?php
class Doctrine_Query extends Doctrine_Query_Abstract implements Countable, Serializable
{
    public static function create($conn = null)
    {
        return new Doctrine_Query($conn);
    }
}

Doctrine_Queryをnewしているだけなんですね。で、ほとんど一緒で唯一違うとしたらコネクションオブジェクトを渡してるかどうかで。通常はコネクション1つで使用していると思うので問題はないと思いますが・・・。

そもそもよくわからないのが「DoctrineのRecordオブジェクトの配列」なんですがDoctrine_Recordは抽象クラスなんですよね。

ちなみにDoctrine_Query#execute()をした場合、正確には配列ではなくDoctrine_CollectionというArrayAccessやIteratorAggregateインターフェースを実装した配列っぽく扱えるクラスが取得できます。もしかしたらその辺の勘違い?まあ考えられるのはschema.ymlかdatabases.ymlの定義に何かしらおかしい部分があるとかですかねえ。

まー確かに中は複雑だからなあ・・・。