[s2container-php5:74] Re: /*IF */ ... --ELSE ... /*END*/の使用方法について

Yusuke Hata nowel @ xole.net
2007年 2月 8日 (木) 00:01:34 JST


ハタです。遅くなってしまって申し訳ありません。

で、結果なのですが、すいません、私の環境(後記)では全て動いてしまいます(@@;;
もし差し支えなければ、データやコードを私の方に送っていただければ検証してみますので、送っていただけませんでしょうか?
一部だけでも構わないです。
私の方でも、もう少し原因を追ってみます。

SQLバインドの使い方はgetFormatByWeightListやgetFormatByWeight2Listの使い方で正しいハズです。

以下は、その時のログになります。
------- <<ここから>> -------
[DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM hoge WHERE hoge.weight=100
object(S2Dao_ArrayList)#454 (1) {
  [0]=>
  object(HogeEntity)#457 (4) {
    :
  }
}
[DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM hoge WHERE hoge.weight is null
object(S2Dao_ArrayList)#453 (0) {
}
[DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM hoge WHERE hoge.weight=100
object(S2Dao_ArrayList)#446 (1) {
  [0]=>
  object(HogeEntity)#456 (4) {
    :
  }
}
[DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM hoge WHERE isnull(hoge.weight)
object(S2Dao_ArrayList)#445 (0) {
}
[DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM hoge WHERE hoge.weight =100
object(S2Dao_ArrayList)#353 (1) {
  [0]=>
  object(HogeEntity)#455 (4) {
    :
  }
}
[DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM hoge WHERE hoge.weight is null
object(S2Dao_ArrayList)#447 (0) {
}
------- <</ここまで>> -------

また、リファレンスに載せているコードですが、一部DBMSで正常に動かないことがあるので
以下のように修正することで動く可能性があります。

------- <<ここから>> -------
/*IF hoge != null*/hoge = /*hoge*/'abc'
  -- ELSE hoge is null
 # --[ここに半角スペース]ELSE hoge is null
/*END*/
------- <</ここまで>> -------


以下は作成してみたモノです。

interface HogeDao {
    const BEAN = "HogeEntity";
    const getFormatByWeightList_QUERY = '/*IF weight != null*/hoge.weight=/*weight*/0 --ELSE hoge.weight is null/*END*/';
    public function getFormatByWeightList($weight = null);

    const getFormatByWeight2List_QUERY = '/*IF weight != null*/hoge.weight=/*weight*/0 --ELSE isnull(hoge.weight)/*END*/';
    public function getFormatByWeight2List($weight = null);

    const getFormatByWeight3List_QUERY = 'hoge.weight /*IF weight != null*/=/*weight*/0 --ELSE is null/*END*/';
    public function getFormatByWeight3List($weight = null);
}

class HogeEntity {
    const TABLE = "hoge";
    private $id;
    private $weight;
    private $aaa;
    private $bbb;
    :(setter/getterなので省略)
}
create table hoge(
    id integer not null auto_increment,
    weight varchar(255) not null,
    aaa varchar(255),
    bbb varchar(255),
    primary key(id)
);

私の環境は以下になります。(なるべく合わせてみました)
OpenSuSE 10.2
PHP 5.1.6
MySql 5.0.26
S2Dao.PHP5 1.1.1
S2Container.PHP5 1.1.1

以上です。よろしくお願いします。

On Tue, 06 Feb 2007 16:27:19 +0900
Eishi Kuroda <kuroda @ jetsetrecords.net> wrote:

> こんにちは、黒田です。
> 
> 立て続けに質問してすみません。
> S2Daoのコメントの使用についてなのですが、
> 
> 下記のように/*IF */コメントを使用しようと思い試してみたのですが、
> リファレンスに沿ってまず、下記のように設定したところ、上手くいきませ
> ん。
> 
> const getFormatByWeightList_QUERY = '/*IF weight !=
> null*/formats.weight=/*weight*/0 --ELSE formats.weight is
> null/*END*/'; public function getFormatByWeightList($weight = null);
> 
> 生成されたクエリのWHERE以下は下記の通りとなり、SQLExceptionとなりま
> す。
> 
> $dao->getFormatByWeightList(100) 
> WHERE 100
> 
> $dao->getFormatByWeightList(null)
> WHERE is null 
> 
> 
> 次に、下記のようにしてみました。
> 
> const getFormatByWeight2List_QUERY = '/*IF weight !=
> null*/formats.weight=/*weight*/0 --ELSE isnull
> (formats.weight)/*END*/'; public function getFormatByWeight2List
> ($weight = null);
> 
> 引数100の場合は同じなのでエラーでしたが、nullの場合、WHERE以下が下記の
> ように生成され、成功します。
> 
> WHERE isnull(formats.weight)
> 
> 
> 最後に、下記のようにしてみました。
> 
> const getFormatByWeight3List_QUERY = 'formats.weight /*IF weight !=
> null*/=/*weight*/0 --ELSE is null/*END*/'; public function
> getFormatByWeight3List($weight = null);
> 
> これだと、引数100, nullの場合それぞれ、
> 
> WHERE formats.weight =100
> WHERE formats.weight is null
> 
> となり、両方成功します。
> QUERYアノテーションをSQLに変えて同様に行っても、同じ結果でした。
> 
> 本当は一番最初の書き方で使える筈だと思うのですが、一番最後の方法で使う
> しかないのでしょうか? それとも、根本的に何かを間違っているのでしょう
> か?
> 
> リファレンスには下記の例が載っていたのですが、これだと上手く行かないと
> 思います。
> 
> /*IF hoge != null*/hoge = /*hoge*/'abc'
>   --ELSE hoge is null
> /*END*/
> 
> 
> 環境は下記の通りです。
> CentOS 4.3
> PHP 5.1.6
> MySql 5.0.22
> S2Dao.PHP5 1.1.1
> S2Container.PHP5 1.1.1
> 
> では、よろしくお願いいたします。
> 
> 黒田
> 
> _______________________________________________
> S2Container-PHP5 mailing list
> S2Container-PHP5 @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/s2container-php5


-- 
Yusuke Hata <nowel @ xole.net>
blog: http://blog.xole.net/


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