2

我已经开始使用 Symfony2 和 MongoDB(Doctrine ODM),并且很难让唯一验证器约束在多个字段上工作(一个字段使用 DBRef 引用另一个 MongoDB 文档)。在我的validation.yml 文件中,我有:

Acme\SomeBundle\Document\ArticlePosition:
    constraints:
        - Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique:
            fields: [position, section]

“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

部分文档位于与 ArticlePosition 文档不同的包中。

4

1 回答 1

2

这更像是一种解决方法而不是解决方案。

首先,在您的控制器中,您必须在调用 $form->isValid() 之前手动将部分链接到 ArticlePosition。

$entity = new ArticlePosition();
$entity->setSection($section); 
...
$form->handleRequest($request);
if ($form->isValid()) {
    ...
}

其次,您必须为唯一约束指定自定义存储库方法。

# validation.yml
Acme\DefaultBundle\Document\ArticlePosition:
    constraints:
        - Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique:
            fields: [section, position]
            repositoryMethod: findUniqueBy

在您的 ArticlePositionRepository 中

public function findUniqueBy($criteria)
{
    $section = $criteria['section'];
    $position = $criteria['position'];

    return $this->findBy(array('section.id' => $section, 'position' => $position));
}

这里的关键是在 findBy 中为引用字段添加 .id ,以便 Mongodb 正确查询结果。

于 2014-03-02T01:53:52.210 回答