Doctrine ORM в чём разница между EntityManager->merge() и EntityManager->persist()?

В документации Doctrine описано, что метод merge() создаёт новый объект, копирует его состояние и добавляет в persistance context.
Неоднократно встречал подобный код:
$entity = $em->getRepository(...)->findOne($id);
if (null === $entity) {
    $entity = new Entity();
    $em->persist($entity);
} else {
    $entity->setGeneratedAt(new \DateTime());
    $em->merge($entity);
}

$em->flush();


Вопрос в следующем, зачем используется $em->merge(), ведь вызов не присваивается никакой переменной и с новой сущностью не производится никаких действий, сущность $entity не является detached и уже находится в persistance context.
  • Вопрос задан
  • 4933 просмотра
Пригласить эксперта
Ответы на вопрос 2
Stafox
@Stafox
Web developer со всеми вытекающими...
Мерж здесь абсолютно не нужен. Тот кто его использовал в этом месте не имеет полного представления как работает доктрина.

Мерж может использоваться, когда сущность была задетачена, и ее снова нужно добавить как отслеживаемую в энтити менеджер. И да, это будет новый объект с новым spl object hash’ом
Ответ написан
Комментировать
@v0ff
в первом варианте, когда сущьность не найдена, и результат нулл, то надо создать новый объект и заперсистить его перед записью
И если запись уже найдена, просто обновить её ! т.е. смерджить.

и в конце отправка на запись в БД, т.е. собираеются все запроссы и одной большой пачкой отправляются на запись в БД. и указанные выше(в примере) и те которые были указаны в $em->persist(...) ранее !

В вашем примере оч хорошо показано, что обновление записи идет - замена даты создания/генерации
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы