我有一个包含重复内容的数据Feed(不知道为什么,它是一个外部Feed),但是我们需要插入所有对标题和类型有约束的项目,例如
这些可以存在:
但是只有其中一个存在:
这是我使用的实体代码:
/**
* 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();
期间被抛出,但我不确定如果电话中包含上述错误我将如何忽略?
答案 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()函数......可能不是最好的解决方案,但它适用于我的情况...