2

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 ドキュメントとは別のバンドルにあります。

4

1 に答える 1