【问题标题】:Symfony2 unique constraint with multiple fields and mongodbSymfony2 具有多个字段和 mongodb 的唯一约束
【发布时间】:2013-08-08 17:55:58
【问题描述】:

我已经开始使用 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

section 文档与 ArticlePosition 文档位于一个单独的包中。

【问题讨论】:

    标签: mongodb symfony doctrine-odm


    【解决方案1】:

    这与其说是解决方案,不如说是一种变通方法。

    首先,在您的控制器中,您必须在调用 $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正确查询结果。

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2013-01-19
      • 2022-09-30
      • 1970-01-01
      • 2013-04-30
      • 2014-07-22
      • 2011-01-31
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多