Doctrine2 MongoDB ODM复合键(UniqueEntity)

时间:2014-10-20 09:12:39

标签: 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({"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
{
...

但实际上这确实允许使用相同的模式和编号保留发票。

1 个答案:

答案 0 :(得分:2)

我担心你在这里将苹果与梨进行比较。

Doctrine 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,而ZF2 Form又使用Validator组件进行表单验证。其目的是验证用户输入。

换句话说:这种验证与MongoDB完全不同。虽然Validator组件在收到用户输入时强制执行规则(因此数据发送到数据库之前),但MongoDB在尝试存储数据时强制执行数据完整性(因此数据之后)被发送到数据库)。

相当于ZF2

我认为您在Zend Framework 2中搜索等效的@UniqueEntity注释。您需要查看ZF2 Validator或至少ZF2 DoctrineModule。< / p>

您可能正在使用ZF2 DoctrineMongoODMModule,或者至少使用validator documentation of ZF2 DoctrineModule。请查看{{3}}以了解如何使用此功能。