我正在玩一点 Symfony2 和 Doctrine2。
我有一个具有唯一标题的实体,例如:
class listItem
{
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @orm:Column(type="string", length="255", unique="true")
* @assert:NotBlank()
*/
protected $title;
现在我正在获取一个 json 并用这些项目更新我的数据库:
$em = $this->get('doctrine.orm.entity_manager');
foreach($json->value->items as $item) {
$listItem = new ListItem();
$listItem->setTitle($item->title);
$em->persist($listItem);
}
$em->flush();
第一次工作正常。但我第二次遇到 sql 错误(当然):Integrity constraint violation: 1062 Duplicate entry
有时我的 json 文件会更新,有些项目是新的,有些不是。有没有办法告诉实体管理器跳过重复文件并插入新文件?
最好的方法是什么?
感谢所有帮助。如果有不清楚的地方请发表评论
编辑:
对我有用的是做这样的事情:
$uniqueness = $em->getRepository('ListItem')->checkUniqueness($item->title);
if(false == $uniqueness) {
continue;
}
$listItem = new ListItem();
$listItem->setTitle($item->title);
$em->persist($listItem);
$em->flush();
}
checkUniqueness
是我的 ListItem Repo 中的一种方法,用于检查标题是否已经在我的数据库中。
那太糟了。这是每个项目的 2 个数据库查询。这最终会为此操作产生大约 85 个数据库查询。