搜索

首页  >  问答  >  正文

symfony - Unique Constraint 在保存前如何判断已经有同样数据?

if(!$workflow_entity = $em->getRepository('AlbatrossAceBundle:Workflow')->findByIdAndStatus($line[$titleArr['WorkflowStepID']],$line[$titleArr['WorkflowStatus']])){
                        $workflow_entity = new Workflow();
                        $workflow_entity->setWorkflowStatus($line[$titleArr['WorkflowStatus']]);
                        $workflow_entity->setWorkflowStepID($line[$titleArr['WorkflowStepID']]);
                        $em->persist($workflow_entity);
}

我只检查当前数据库中是否已经有相同的数据,
但正在插入的数据中已经有数个是一样的数据.
所以插入操作时, 给出了这样的信息
An exception occurred while executing 'INSERT INTO workflow (workflow_step_id, workflow_status) VALUES (?, ?)' with params ["10", "Assigned"]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10-Assigned' for key 'stepid_status_uniq'

  uniqueConstraints:
    stepid_status_uniq:
        columns: [ workflow_step_id, workflow_status ]

我已经在数据库中创建唯一约束(我不知道这样说对不对)
但现在正要插入的数个数据在flash 之前就存在同样的数据
我如何在保存到数据库之前就知道当前数据已经违反唯一规则了呢?

大家讲道理大家讲道理2789 天前801

全部回复(2)我来回复

  • 高洛峰

    高洛峰2017-05-16 16:46:44

    你可以根据你的约束规则,在插入前先查询一次,比如按照你的例子,先查询

    SELECT count(*) FROM workflow WHERE workflow_step_id='10' AND workflow_status='Assigned'
    

    如果结果不为0,则说明继续插入会违反唯一规则。

    当然,实际上并不推荐这么做,每次插入都去检查是很费资源的
    你可以考虑使用

    INSERT IGNORE INTO
    

    然后在插入后检查affected_rows,如果返回为0说明数据插入失败,这时候再去进行检查是否违反了约束规则。

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-16 16:46:44

    你应该使用Validation,

    http://symfony.com/doc/master/reference/constraints/UniqueEntity.html

    回复
    0
  • 取消回复