Symfony2 と MongoDB (Doctrine ODM) を使い始めましたが、一意のバリデータ制約を複数のフィールドで機能させるのに苦労しています (1 つのフィールドが別の MongoDB ドキュメントを DBRef で参照しています)。私の validation.yml ファイルには、次のものがあります。
Acme\SomeBundle\Document\ArticlePosition:
constraints:
- Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique:
fields: [position, section]
「位置」フィールドは整数で、「セクション」は別のバンドル内のエンティティを指す referenceOne フィールドです。
このフォームを送信すると、プロファイラーに次のクエリが表示されます。
db.article_position.find({ "position": 1, "section": "51ff78494fae886b1f7c0f1d" });
db.article_position.insert({ "000000005dc659f30000000082e5d25d": { "_id":ObjectId("5203d1804fae880e801fd12d"), "position": 1, "section": { "$ref": "section", "$id": ObjectId("51ff78494fae886b1f7c0f1d"), "$db": "my_db" } } });
Symfony/Doctrine は正しいことをしようとしているようです。最初の find() は、位置フィールドとセクション フィールドの両方で一致するドキュメントを探しますが、DBRef フィールド ($ref、$id、$db) がなく、常に空のセットを返します。
find() クエリは次のようになります。
db.article_position.find({ "position": 1, "section": { "$ref": "section", "$id": ObjectId("51ff78494fae886b1f7c0f1d"), "$db": "my_db" }});
私のドクトリン YAML ファイルは次のようになります。
Acme\SomeBundle\Document\ArticlePosition
type: document
collection: article_position
referenceOne:
section:
targetDocument: Acme\SomeOtherBundle\Document\Section
fields:
id:
type: id
id: true
position:
type: int
セクション ドキュメントは、ArticlePosition ドキュメントとは別のバンドルにあります。