0

Doctrine 2 MongoDB ODMを使用していますが、1 つの特定の関係を除いてすべて正常に動作しています。あいまいなのは、プロジェクト内に一見同一の関係があり、それらがすべて正常に機能することです。

namespace Project\Entities\World; // same NS as class, but this is after
// splitting functionality from Entity to MappedSuperclass, didn't work either

/**
 * @ReferenceOne(targetDocument="Project\Entities\World")
 * @var IWorld
 */
protected $world;

Project\Entities\PlayerCharacter で使用 (上記の Project\Entities\World\Object を拡張) =>

namespace Project\Entities;

/**
 * @Document(collection="worlds")
 * @HasLifecycleCallbacks
 */
class World {
    /**
 * @ReferenceMany(targetDocument="PlayerCharacter")
 * @var ArrayCollection
 */
protected $playerCharacters;
}

$world 変数を設定すると、PHP スクリプトで問題ありません。$objectManager->refresh($character), $character->getWorld() === $world でも問題ありません。ただし、データベース自体には表示されず (設定直後に終了し、どこかで誤って変更されないようにフラッシュします)、PlayerCharacter 側でのみ World 側にのみ表示されます

一方で

class PlayerCharacter {
/**
 * @ReferenceOne(targetDocument="User")
 * @var User
 */
protected $user;
 }

=>

/**
 * @Document(collection="users")
 * @HasLifecycleCallbacks
 */
class User {
    /**
     * @ReferenceMany(targetDocument="PlayerCharacter")
     * @var ArrayCollection
     */
    protected $characters;
}

作品

簡易版では:
- PlayerCharacter::$user <==(1:N)==> User::$characters
(およびその他すべて) は問題ありませんが、
- PlayerCharacter::$world <==(1:N)のみです。 ==> World::$playerCharacters
は World 側でのみ機能します

何日も見ていると、何も違うものを見つけることができません。

  • プロパティ名の名前を変更しようとしましたが、変更はありません
  • キャラクターのハイドレーター エントリ ---> ワールドが他と同じように見える
  • エントリを半手動で (RockMongo 経由で) 追加すると、正常に動作します
  • 「ワールド」フィールドを NULL として作成しても違いはありません。{} を使用すると、「未定義のインデックス: $id」と表示されますが、これは予想される動作だと思います。
  • エンティティも個別に非常にうまく機能します。実際には、この 1 つの関係だけです。

不足している/見落とされているものはありますか、または永続化されない理由を発見するために何ができますか?

(さらに情報が必要な場合は投稿を編集します)

ありがとうございました!

4

1 に答える 1

0

わかりました。UoWにはWorld=>nullを含むエントリとWorld=>... WorldProxyを含むエントリが多数あったため、後者はおそらく上書きされました。

割り当てがこれを解決する前にflush()を使用する

于 2011-08-14T07:58:38.237 に答える