Doctrine orm Doctrine2,ZF2的JoinColumn上的唯一约束?

Doctrine orm Doctrine2,ZF2的JoinColumn上的唯一约束?,doctrine-orm,zend-framework2,unique-constraint,Doctrine Orm,Zend Framework2,Unique Constraint,我有一个包含重复内容的数据提要(不知道为什么,这是一个外部提要),但是我们需要插入标题和类型有约束的所有项目,即 这些可能存在: 名称_A,类型_A 名称A,类型B 但其中只有一个应该存在: 名称_A,类型_A 名称_A,类型_A 以下是我正在使用的实体代码: /** * Restauration * * @ORM\Table(name="restauration", uniqueConstraints={@ORM\UniqueConstraint(name="name_uniqu

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

这些可能存在:

  • 名称_A,类型_A
  • 名称A,类型B
但其中只有一个应该存在:

  • 名称_A,类型_A
  • 名称_A,类型_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

我想知道是否简单的方法就是忽略抛出的异常?看起来是调用
$em->persist()时抛出的
driverExceptionDuringQuery
但我不确定如果调用包含上述错误,我将如何忽略?

如果要忽略该错误,请停止使用约束完整性

{@ORM\UniqueConstraint(name=“name\u unique”,columns={“name\u 1”//etc…”

您的数据具有名称_1非唯一性这就是出现此错误的原因,完整性约束检查此项,如果不删除唯一约束参数,则不能忽略此项

编辑:

然后,在持久化数据之前,必须检查表中的实际数据,如果name_1和Type都有重复条目,则不要持久化它们

对于这两种检查,您可以使用:

@UniqueEntity({"name", "type"})
可在此处找到:


即使它是针对SF2的,它也是同一个概念,我已经从表中删除了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()函数…可能不是最佳解决方案,但它适合我的情况…

我不能将name_1用作唯一的,因为我们必须使用不同“type”的name_1的副本s、 …理想情况下,我只想捕获错误并忽略此重复19错误(否则抛出),或者让生成的SQL生成类似INSERT或ignore INTO的内容?但不确定是否存在sqlite?UniqueConstraint是专门存在的,这样我们就不会得到相同名称+类型的重复(即NameA、TypeA两次。但我们接受NameA和不同的TypesA、B、C等)在保留数据之前检查数据。如果存在重复,则不保留数据