Пропускать объекты при сбросе, когда они являются Duplicate

Я немного поиграю с 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 запросов к базе данных.

6
задан j0k 20 September 2012 в 07:12
поделиться