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等)在保留数据之前检查数据。如果存在重复,则不保留数据