DoctrineTweetこんにちは、小川です。1.2がリリースされ、Jobeetという新たなチュートリアルが始まったりとsymfony界隈がとても盛り上がっていますね。symfonyに力を入れてるアシアルとしてもうれしい限りです。1.2にデフォルトで含まれているDoctrine。そのDoctrineでデータベースからオブジェクトを取得するにはDoctrine_Queryというオブジェクトを使いますが、実はこのDoctrine_Queryはサブクエリにも対応しています。今回はそのサブクエリの使い方をご紹介したいと思います。今回使うスキーマは以下になります。Ordersでは、早速サブクエリを使ってオブジェクトを取得してみましょう。以下は購入平均額が3000円を超えている優良ユーザをサブクエリを用いて取得する例です。Doctrine::getTable('User')->getPrimeUsers();まずcreateQuery()で基準となるDoctrine_Queryオブジェクトを生成します。そのオブジェクトにcreateSubquery()というメッセージを送ると、もう1つDoctrine_Queryオブジェクトが生成されます。このオブジェクトは内部でサブクエリフラグを持っており、このオブジェクトに対してサブクエリの条件をつけていきます。このサブクエリを適応する方法は至って単純です。getDql()メソッドで文字列にして、where文の中にいれるだけです。ここでプレースホルダを使用するとシングルコーテーションで囲まれてクエリとして認識されないので、直接文字列の内部に入れてください。ちなみにサブクエリを用いるときに、SELECT句やFROM句の中にもサブクエリを使いたい場合があると思います。試してみただけなのですが、SELECT句にはサブクエリを使えるものの、FROM句の中では使えないようです。いうのも、どうやらDQLでは、FROM句には必ず実在するクラス名を指定する必要があるようです。FROM句にサブクエリを使いたい場合は素直にSQLを書きましょう。1.2にはDoctrineが最初から含まれていますので、今までPropelを使っていた方々もぜひ使ってみてください。今後もsymfonyやDoctrineに関する様々な情報やノウハウを配信していく予定ですので、どうぞよろしくお願いいたします。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。