1対1の関係を持つ単純なスキーマがあります。
Site:
columns:
name: { type: string(255) }
User:
columns:
name: { type: string(255) }
site_id: { type: integer }
relations:
Site: { foreignType: one }
私はSite::save()メソッド(管理ジェネレーターからサイトを編集するときに呼び出されます)をオーバーライドしています。ここで、ユーザーとsmthを実行する必要があり、ユーザーはサイトを再度参照します。
echo $this->getUser()->getSite()->getName();
getSite()が呼び出されると、Doctrineがdbから「Site」リレーションをロードし、IDマップに従って$ thisを置き換えるため、$thisはデータベースの値で上書きされます。明らかに、オブジェクトへのすべての変更は失われます。コードを読んだ後、getUser()の後にUserオブジェクトに_references ['Site']が設定されていないことがわかりました。そのため、DoctrineはdbからSiteを読み込もうとします。私が前に置くなら
$ this-> getUser()-> setSite($ this);
、その後、すべてが期待どおりに機能し、追加のクエリは行われません。別の回避策は、クエリでリレーションを結合することです。
$this->site = Doctrine::getTable('Site')
->createQuery('s')
->leftJoin('s.User u')
->leftJoin('u.Site us')
->fetchOne();
しかし、それは意図された動作ですか?$ this === $ this-> getUser()-> getSite()であることをDoctrineに知らせるにはどうすればよいですか?私はDoctrine1.2.4でsymfony1.4.18を使用しています。ありがとうございました。