[seasar-php:136] Re: S2DaoのUpdateについて

ISHITOYA Kentaro [E-MAIL ADDRESS DELETED]
2007年 5月 19日 (土) 23:30:19 JST


石戸谷です。

一人で騒いでいて申し訳ありません。
その後を報告しておきます。

結論としては、エンティティのN:1のリレーションを設定したプロパティとは別
に、同じカラムを設定したリレーションを設定しないプロパティを用意すること
で、値を更新できました。

つまり、
protected $personTypeId;
const personTypeId_COLUMN = 'person_type_id';
const personTypeId_RELNO = 0;
const personTypeId_RELKEYS = 'person_type_id:id';
public function setPersonTypeId(PersonTypesEntity $entity){
$this->personTypeId = $entity; }
public function getPersonTypeId(){ return $this->personTypeId; }

protected $personTypeIdDirect;
const personTypeId2_COLUMN = 'person_type_id';
public function setPersonTypeIdDirect($entity){
$this->personTypeIdDirect = $entity; }
public function getPersonTypeIdDirect(){ return $this->personTypeIdDirect; }

みたいな感じです。

ところで、二つ目を定義せず、一つ目の定義を
protected $personTypeId;
const personTypeId_COLUMN = 'person_type_id';
public function setPersonTypeId($id){ $this->personTypeId = $id; }
public function getPersonTypeId(){ return $this->personTypeId; }
とすると、

Fatal error: Call to a member function getBeanMetaData() on a non-object
in S2Dao_BeanMetaDataImpl.class.php on line 408
というエラーが出ますが、これは外部キーなのに、N:1のリレーションを張らな
かったために起きたエラーでしょうか。

以上報告でした。

ISHITOYA Kentaro wrote:
> 石戸谷です。
>
> 追記です。
> 以下のPERSISTENT_PROPSアノテーションをdaoに設定すると、
> const update_PERSISTENT_PROPS = 'personTypeId';
> 次のエラーが出ます。
>
> Fatal error: Uncaught exception
> 'S2Container_PropertyNotFoundRuntimeException' with message 'Property[]
> of class[PersonsEntity] not found' in
> C:\cygwin\home\kent\test\s2dao\s2dao.php5\build\s2dao.php5\S2Dao\S2Dao_DtoMetaDataImpl.class.php:60
> Stack trace:
> #0
> C:\cygwin\home\kent\test\s2dao\s2dao.php5\build\s2dao.php5\s2dao.core.classes.php(876):S2Dao_DtoMetaDataImpl->getPropertyType('personTypeId')
> #1
> C:\cygwin\home\kent\test\s2dao\s2dao.php5\build\s2dao.php5\S2Dao\S2Dao_UpdateAutoStaticCommand.class.php(51):
> S2Dao_AbstractAutoStaticCommand->setupUpdatePropertyTypes(Array)
> #2
> C:\cygwin\home\kent\test\s2dao\s2dao.php5\build\s2dao.php5\s2dao.core.classes.php(839):S2Dao_UpdateAutoStaticCommand->setupPropertyTypes(Array)
> #3
> C:\cygwin\home\kent\test\s2dao\s2dao.php5\build\s2dao.php5\S2Dao\S2Dao_UpdateAutoStaticCommand.class.php(35):S2Dao_AbstractAutoStaticCommand->__construct(Ob
> ject(S2Container_PDODataSource), Object(S2Dao_BasicStatementFactory),
> Object(S2Dao_BeanMetaDataImpl), Array)
> #4 C:\cygwin\home\kent\test\s2dao\s2dao.p in
> C:\cygwin\home\kent\test\s2dao\s2dao.php5\build\s2dao.php5\S2Dao\S2Dao_DtoMetaDataImpl.class.php
> on line 60
>
> ちなみに、
>   
>> S2Dao_DaoMetaDataImpl.class.php:350行目の、getPersistentPropertyNamesが、
>> 返しているarraysの中にrelkeyが含まれておらず、処理的には、関数内の2つめ
>> のif文(378行目)です。
>> RelationPropertyの値をnamesに入れていないからかなとおもって、いれてみた
>> のですが、エラーで動きませんでした。
>>     
> で、出るエラーメッセージは、上記と同じものです。
> 以上よろしくお願いいたします。
>
> ISHITOYA Kentaro wrote:
>   
>> 石戸谷です。
>>
>> 連投申し訳ありません。
>> 質問なのですが、N:1のリレーションを張ったプロパティの値を更新をするに
>> はどのようにすればいいのでしょうか。
>>
>> descriptions: id(pk) description
>> person_types: id(pk) name
>> persons: id(pk) descriptons_id(fk) person_types_id(fk) nickname
>>
>> というテーブルがあって、PersonsEntityからN:1のリレーションを張っている
>> とします。
>> テーブルには適当なデータが入っていて、
>>
>> $person = $dao->getById(0);//適当なデータ
>> $person->getPersonTypeId->setId(2); //personのperson_types_idを2にしたい
>> $dao->update($person);
>>
>> ではアップデートされなかったので、
>> $personType = new PersonTypesEntity();
>> $personType->setId(2);
>> $person->setPersonTypeId($personType);
>> $dao->update($person);
>>
>> どちらも生成されるSQLは、
>> UPDATE persons SET nickname = 'administrator' WHERE id = 1
>> で、リレーションが張られているもののデータはSQLに含まれませんでした。
>>
>> そこで、コードを見てみると、
>> S2Dao_DaoMetaDataImpl.class.php:350行目の、getPersistentPropertyNamesが、
>> 返しているarraysの中にrelkeyが含まれておらず、処理的には、関数内の2つめ
>> のif文(378行目)です。
>> RelationPropertyの値をnamesに入れていないからかなとおもって、いれてみた
>> のですが、エラーで動きませんでした。
>>
>> N:1のリレーションを張ったプロパティの値を更新するには、どうすればいいの
>> でしょうか。
>> ご教示いただければ幸いです。
>> 以上よろしくお願いいたします。
>> _______________________________________________
>> seasar-php mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-php
>>   
>>     
>
> _______________________________________________
> seasar-php mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-php
>   



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