Doctrine2 MongoDB ODM复合密钥(Uniquentity)

Doctrine2 MongoDB ODM复合密钥(Uniquentity),mongodb,doctrine-orm,zend-framework2,doctrine-odm,Mongodb,Doctrine Orm,Zend Framework2,Doctrine Odm,我在使用MongoDB在Zf2和Doctrine2中实现某些东西时遇到了问题,这在Symfony2和Doctrine2中相当简单 我有一个发票文档,我想确保Invoice::pattern和Invoice::number的组合是唯一的。一个数字可以出现多次,与模式相同,但模式和发票号的组合应该是唯一的 在Symfony2中,我将使用桥接器 use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; @UniqueEntity(

我在使用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 ODM理论
@ODM\UniqueIndex
索引是的一部分。其目的是在运行控制台命令时创建/更新索引
odm:schema:create
/
odm:schema:update
。MongoDB使用这些索引来加速查找

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

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

用户输入验证
@uniquentity
注释是的一部分。该组件可以单独使用,但大多数开发人员使用,后者反过来使用Validator组件进行表单验证。其目的是验证用户输入

换句话说:这种验证与MongoDB完全不同。当接收到用户输入时(即数据发送到数据库之前),验证程序组件强制执行规则,而MongoDB在尝试存储数据时(即数据发送到数据库之后)强制执行数据完整性

ZF2中的等效项 我认为您正在搜索Zend Framework 2中的
@uniquentity
注释。你需要朝前看,或者至少朝前看


您可能正在使用,或者至少是。请查看以了解如何使用此功能。

DoctrineMongoDB中@ODM\UniqueIndex的问题在于插入操作会以静默方式失败,并且不会引发异常。$dm->flush([“safe”=>true]);已被弃用,因此当前我无法处理失败的插入。约束是数据库级别的。我对Doctrine Mongo ODM没有任何经验,所以当你说持久性失败不会出现在ODM中时,我相信你。但我想说的是,你在比较苹果(框架级验证)和梨(数据库级约束)。如果您想在ZF2中使用类似SF2的
@uniquentity
行为,则需要一个ZF2验证器(如doctriemodule中的验证器)。