doctrineでちょい複雑なクエリをつくってみる

3つくらいのテーブルを結合した結果を出力したいとき。
たとえば、こーんなSQLの結果が欲しいとき。

SELECT 
p.id , p.pcs , p.price , u.text , y.name
FROM
Price as p , Update as u , User as y
WHERE
p.shop_id = $shopid
and p.item_id = $itemid
and p.id = u.id
and u.user_id = y.id
ORDER BY p.create_time desc
LIMIT 10

こんなかんじにかきます。

    $q_plistshop =
      Doctrine::getTable('Price')
      ->createQuery('p')
      ->addFrom('Update as u')
      ->addFrom('User as y')
      ->select('p.id,p.pcs,p.price,u.text,y.name')
      ->where('p.shop_id =  ' . $shopid )
      ->andWhere('p.item_id = ' . $itemid )
      ->andWhere('p.id = u.id')
      ->andWhere('u.user_id = y.id')
      ->addOrderBy('p.create_time desc')
      ->limit(10) ;
    $this->plistshop = $q_plistshop->execute(array(),Doctrine::HYDRATE_NONE);

一見、 $q_plistshop->fetchArray() でいけそうだけど(うまくハイドレーションできんぞ?とかで)怒られる。
いろいろ調べた結果、「Doctrine::HYDRATE_NONE」するとうまくいくっぽい。
この場合、$this->plistshop[数字]じゃないととれないので注意。
あと、勝手に列の順番を並べ替えられたりする(アルファベット順?)のでそのへんも注意。

……まてよ?

p.id as id1 , p.pcs as pcs , ... 

というふうに明示的に名前指定すればハイドレーション関係で怒られずにすむかもしれない。
Doctrineがこのへんで混乱してたようなメッセージ出してた気がするので。

ぶっちゃけ、よくわからん。
このへん、も少し勉強する必要ありそうですね。

参考

Comments are closed.