Я немного поиграю с Symfony2 и Doctrine2.
У меня есть Entity с уникальным заголовком, например:
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 (конечно): Нарушение ограничения целостности: 1062 Повторяющаяся запись
иногда мой файл 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, который проверяет, есть ли заголовок уже в моей базе данных
Это ужасно. это 2 запроса к базе данных для каждого элемента. в итоге для этого действия выполняется около 85 запросов к базе данных.