【问题标题】:Doctrine2 MongoDB ODM Compound Key (UniqueEntity)Doctrine2 MongoDB ODM 复合键 (UniqueEntity)
【发布时间】:2014-12-15 05:23:31
【问题描述】:

我在使用 MongoDB 在 Zf2 和 Doctrine2 中实现一些在 Symfony2 和 Doctrine2 中相当简单的东西时遇到了麻烦。

我有一个发票文档,我想确保 Invoice::pattern 和 Invoice::number 的组合是唯一的。一个数字可以出现多次,与模式相同,但模式和发票号码的组合应该是唯一的。

Symfony2 我会使用桥接器

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

@UniqueEntity({"pattern", "number"})
class Invoice
{
...

但由于显而易见的原因,这在 Zf2 中不起作用。

我当前在 Zend Framework 2 中的注释设置是

/**
 * Class Invoice
 * @package Common\Document\Billing
 *
 * @ODM\Document(
 *     collection="invoice"
 * )
 * @ODM\UniqueIndex(keys={"prefix"="asc", "number"="asc"})
 * @ODM\ChangeTrackingPolicy("DEFERRED_IMPLICIT")
 */
class Invoice
{
...

但这确实允许以相同的模式和编号保存发票。

【问题讨论】:

    标签: mongodb doctrine-orm zend-framework2 doctrine-odm


    【解决方案1】:

    恐怕你在这里比较苹果和梨。

    学说 MongoDB ODM

    @ODM\UniqueIndex 索引是Doctrine MongoDB ODM 的一部分。它的目的是在运行控制台命令odm:schema:create / odm:schema:update 时创建/更新索引。 MongoDB 使用这些索引来加快查找速度。

    创建唯一索引时,MongoDB 将强制执行该唯一性。您可以将其视为一种数据库级别的验证。

    因为这一切都是 Doctrine MongoDB ODM 和 MongoDB 本身的一部分,所以您可以在任何您想要的框架中使用它。 Symfony 2 或 Zend Framework 2 在这里没有任何区别。

    用户输入验证

    @UniqueEntity 注释是Symfony 2's Validator Component 的一部分。该组件可以单独使用,但大多数开发人员使用Form Component,而后者又使用Validator 组件进行表单验证。其目的是验证用户输入。

    换句话说:这种验证与 MongoDB 所做的完全不同。 Validator 组件在收到用户输入时强制执行规则(因此 before 数据发送到数据库),而 MongoDB 在尝试存储数据时强制执行数据完整性(因此 after 数据发送到数据库)。

    在 ZF2 中等效

    我认为您正在寻找 Zend Framework 2 中 @UniqueEntity 注释的等效项。您需要查看 ZF2 Form 或至少 ZF2 Validator

    您可能正在使用ZF2 DoctrineModule,或者至少是ZF2 DoctrineMongoODMModule。查看validator documentation of ZF2 DoctrineModule 了解如何使用它。

    【讨论】:

    • DoctrineMongoDB 中@ODM\UniqueIndex 的问题是插入失败时静默失败,不会抛出异常。 $dm->flush(["safe" => true]);已被弃用,因此目前我无法处理失败的插入。
    • 约束是数据库级别的东西。我对 Doctrine Mongo ODM 没有任何经验,所以当你说持久性失败不会冒泡到 ODM 时,我会相信你。 但是我想说的是,您将苹果(框架级验证)与梨(数据库级约束)进行比较。如果你想要 ZF2 中 SF2 的 @UniqueEntity 行为,你需要一个 ZF2 验证器(就像 DoctrineModule 中的那个)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2012-05-13
    • 2012-09-06
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多