Doctrine2 MongoDB ODM复合密钥(Uniquentity)
我在使用MongoDB在Zf2和Doctrine2中实现某些东西时遇到了问题,这在Symfony2和Doctrine2中相当简单 我有一个发票文档,我想确保Invoice::pattern和Invoice::number的组合是唯一的。一个数字可以出现多次,与模式相同,但模式和发票号的组合应该是唯一的 在Symfony2中,我将使用桥接器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(
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中的验证器)。