[s2container-php5:67] EntityManagerによるQueryの実行とS2Pager.PHPについて

Eishi Kuroda kuroda @ jetsetrecords.net
2006年 12月 22日 (金) 18:43:37 JST


こんにちは、黒田です。

EntityManagerとS2Pager.PHPの組み合わせで質問があります。

少し複雑で動的な検索条件を持ったクエリを発行しようと思い、
EntityManagerを使用してみたのですが、
limitとoffsetによる指定範囲の取得及び、検索件数の取得も同時に行いたいと考え、
EntityManagerとS2Pager.PHPの機能の両方を
組み合わせて使えないかと試行錯誤しています。

データベースはMySqlでlimitとoffsetが使用出来ますので、
S2Pager.PHPの為にdao.diconに下記の様に設定します。

    <component name="interceptor" class="S2Dao_PagerS2DaoInterceptorWrapper">
      <property name="useLimitOffsetQuery">true</property>
    </component>


EntityManagerを使用するため、S2Dao_AbstractDaoを継承し、
Daoクラスを実装するクラスを下記の様に定義します。

GoodsPagerConditionはS2Dao_DefaultPagerConditionを継承した検索条件Dtoです。

    class GoodsDaoImpl extends S2Dao_AbstractDao implements GoodsDao
    {
        public function getGoodsByGoodsPagerConditionList(GoodsPagerCondition $dto)
        {
            ...
        }
    }

といった具合です。

ここで、そのまま
getGoodsByGoodsPagerConditionList($dto);
を呼び出しても、$dtoに設定したlimitやoffsetは無視され、countも設定されません。

S2Dao_PagerS2DaoInterceptorWrapperでは、
useLimitOffsetQueryがtrueの場合、メソッドがabstractの場合にのみ
limitとoffsetを使用したクエリを発行するようになっているため、当然そのようになります。

EntityManagerによる検索を行いつつ、同時に検索件数を取得するには、
どのように行うのがスマートなのでしょうか?
EntityMangaerに与えるクエリにlimitを付ければ指定範囲は取得できますが、
検索件数をどうやって取得するのが良いか悩んでいます。
Daoクラスに
select count(*) from ....
と書くしか無いのでしょうか?
from以下に多数のテーブルがjoinされている場合など、手入力するのは面倒です。

検索に使用したクエリの内容を使って、
select count(*) from (検索に使用したクエリ) as total
といったことが簡単に出来れば良いのですが・・・。

このような場合、みなさんはどのように対応されますか?
では、よろしくお願いいたします。

黒田映史




S2Container-PHP5 メーリングリストの案内