Doctrine2,针对ZF2的JoinColumn的uniqueConstraint?

时间:2014-04-08 16:07:01

标签: doctrine-orm zend-framework2 unique-constraint

我有一个包含重复内容的数据Feed(不知道为什么,它是一个外部Feed),但是我们需要插入所有对标题和类型有约束的项目,例如

这些可以存在:

  • Name_A,Type_A
  • Name_A,Type_B

但是只有其中一个存在:

  • Name_A,Type_A
  • Name_A,Type_A

这是我使用的实体代码:

/**
 * Restauration
 *
 * @ORM\Table(name="restauration", uniqueConstraints={@ORM\UniqueConstraint(name="name_unique", columns={"name_1", "restauration_type"})})
 * @ORM\Entity(repositoryClass="iMotionTools\Repository\RestaurationRepository")
 */
class Restauration
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name_1", type="string", length=128, nullable=true)
     */
    private $name1;

    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="RestaurationType", cascade={"persist"})
     * @ORM\JoinColumn(name="restauration_type", referencedColumnName="id")
     */
    private $type;
}

但是在解析和插入数据时我遇到了这个错误:

SQLSTATE[23000]: Integrity constraint violation: 19 columns name_1, restauration_type are not unique:91:C:\coding\currate\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php

我想知道简单的方法是否只是忽略抛出的异常?看起来driverExceptionDuringQuery在我致电$em->persist();期间被抛出,但我不确定如果电话中包含上述错误我将如何忽略?

2 个答案:

答案 0 :(得分:0)

如果您想忽略它,请停止使用约束完整性。

  

{@ ORM \ UniqueConstraint(name =“name_unique”,columns = {“name_1”// etc ......

你的数据有name_1不唯一这就是为什么你有这个错误,完整性约束检查这个,你不能忽略它,不删除唯一约束参数。

编辑:

在保存数据之前,您必须检查表中的实际数据,如果name_1和Type都有重复的条目,并且不要保留它们。

进行检查,你可以使用:

@UniqueEntity({"name", "type"})

在这里找到: validation multiple constraint columns

即使是针对SF2,也是相同的概念

答案 1 :(得分:0)

我已从表中删除了UniqueConstraint属性,并添加了一个函数来检查对象列表(后来得到$entity->persist() - ed),使用数组,以便我可以轻松地将它用于不同的实体类型,它似乎现在运作良好。

        $key = $hashList ? '' : $page['id'];
        foreach ($hashList as $method) {
            $val = $object->{$method}();

            if(is_object($val)) {
                $val = $val->getId();
            }

            $key .= $val;
        }

        $key = md5($key);

        $objects[$key] = $object;

其中$hashList = array('getName', 'getType') - 和getType返回一个对象(因为它是另一个实体),但它总是有getId()函数......可能不是最好的解决方案,但它适用于我的情况...