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

yonekawa tcgrim @ gmail.com
2006年 12月 25日 (月) 10:50:04 JST


yonekawaです。

仰るとおり現状では、EntityManagerによるクエリと
S2Pagerを連携することができないようになっています。

> S2Dao_PagerS2DaoInterceptorWrapperでは、
> useLimitOffsetQueryがtrueの場合、メソッドがabstractの場合にのみ
> limitとoffsetを使用したクエリを発行するようになっているため、当然そのようになります。
S2Pager.PHP5はLimit、Offset句を利用する場合の実装は
S2Dao.PHP5のクエリ生成を途中で奪ってLimit句を付加するようになっています。
EntityManagerだとこのクエリ生成が別なので、現状では処理を奪うことができません。


S2Dao_PagerUtilクラスに用意されたメソッドを使用することで
S2Daoを介さずに検索件数を取得することはできますが、
useLimitOffsetQuery=Falseの場合の処理と同じ処理を行うため(つまり配列操作)
Limit句を使った場合よりもパフォーマンスが落ちます。


なので、
> EntityManagerによる検索を行いつつ、同時に検索件数を取得するには、
> どのように行うのがスマートなのでしょうか?
現状ではご指摘の通り、
Daoクラスにselect count(*) from ....
と書くしかないと思われます(もっといい方法あるでしょうか?)

この辺はS2Pager.PHP5の機構を見直す必要があるのかもしれませんが、
EntityManagerを使うのであればS2Pagerが余計なクエリを付加するのは望ましくないかと思うのですが・・・

--
yonekawa<tcgrim @ gmail.com>
blog:http://d.hatena.ne.jp/yonekawa/

06/12/22 に Eishi Kuroda<kuroda @ jetsetrecords.net> さんは書きました:
> こんにちは、黒田です。
>
> 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 mailing list
> S2Container-PHP5 @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/s2container-php5
>


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