1

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を使用しています。ありがとうございました。

4

0 に答える 0