[seasar-php:129] Re: S2DaoのDTOについて

Yusuke Hata [E-MAIL ADDRESS DELETED]
2007年 5月 10日 (木) 04:01:36 JST


ハタです。
おひさしぶりです。

下記の内容を読む限りでは、examples/EmployeeAutoDaoと同じような使い方と認識しました。

DTOでは自動的検索用SQLに値を設定する際に、マッピング定義(_COLUMNアノテーション)を必要とします。
このDTOでのマッピングでは、Daoが検索する際に指定したBeanで取得するプロパティに対して
カラム名のマッピング定義を行います。
これはDTOのプロパティがBeanのそれと一致するかが判別できないためにそうしています。(N:1の関係などで)

"nickname" というカラム名はBeanで指定されているみたいなのですが、
DTO側でも_COLUMN定義で"nickname" と指定しても動作は変わらずでしょうか?
# const nickname2_COLUMN = "nickname" ← のnickname2というプロパティはいらないのでは。

また、内部実装として「テーブルに存在しないプロパティを無視する」というのがあります。
ちょうど

> S2Dao_DaoMetaDataImpl.class.phpの
> 485 行目の、
>             if($dmd->hasPropertyType($aliasName)){
>                 continue;
>             }

周辺のifが並んでいる部分がそれにあたります。
もしコメントアウトすることで、期待する動作をするのであれば
次のリリース時にコメントアウトした状態で出そうと思います。

まだテストを流していないですが
たぶん、この部分を取り除いても大きな変更などはないはずですので。

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

ISHITOYA Kentaro <[E-MAIL ADDRESS DELETED]> wrote:

> 石戸谷と申します。
> 
> S2Daoを最近使わせていただいているのですが、わからないことがあるので質
> 問させてください。
> バージョンは、1.1.2です。
> 
> ・DTOで自動検索SQLを生成しようとしても生成されない。
> 
> DAOに、
> 
> public function findByPersonsSearchCondition(PersonsSearchCondition
> $dto);
> 
> というメソッドを定義して、
> 
> class PersonsSearchCondition{
>     public $nickname = "hogehoge";
>     public function setNickname($nickname){
>         $this->nickname = $nickname;
>     }
>     public function getNickname(){
>         return $this->nickname;
>     }
> }
> 
> という、DTOを定義しました。
> この状態で、
> 
> $dao = ComponentFactory::getComponent("AutoPersonsDao");
> $entity = new PersonsSearchCondition();
> $entity->setNickname("mogemoge");
> $entities = $dao->findByPersonsSearchCondition($entity);
> 
> としても、WHERE句が生成されません。いろいろおってみたのですが、
> S2DaoInterceptor.class.phpの45行目あたりで、sqlをダンプすると、
> 
> /*BEGIN*/ WHERE /*END*/
> 
> のように、最後に空のWHERE句が生成されていました。
> いまいちよくわかっていないのですが、S2Dao_DaoMetaDataImpl.class.phpの
> 485 行目の、
>             if($dmd->hasPropertyType($aliasName)){
>                 continue;
>             }
> 
> という、命令をコメントアウトすると、意図したとおりに動作します。あるい
> は、DTOの定義で、
> class PersonsSearchCondition{
>     const nickname2_COLUMN = "nickname";
>     public $nickname2;
>     public function setNickname2($nickname2){
>         $this->nickname2 = $nickname2;
>     }
>     public function getNickname2(){
>         return $this->nickname2;
>     }
> }
> 
> のようにすると、やはり意図したとおりに動作します。
> 
> 何か根本的にやり方が間違っているような気がしています。
> 問題の解決方法あるいはポインタをご教示いただければ幸いです。
> よろしくおねがいいたします。
> _______________________________________________
> seasar-php mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-php


-- 
Yusuke Hata <[E-MAIL ADDRESS DELETED]>
blog: http://blog.xole.net/


seasar-php メーリングリストの案内