Я начал работать с Symfony2 и MongoDB (Doctrine ODM), и у меня возникли трудности с тем, чтобы уникальное ограничение валидатора работало с несколькими полями (одно поле ссылается на другой документ 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() ищет соответствующий документ с полем position и section, но в нем отсутствуют поля 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
Документ section находится в отдельном пакете от документа ArticlePosition.