Вы не можете. Доктрина сейчас не поддерживается.
Что вы можете сделать, это подражать тому, что делает MySQL, проверив, существует ли сущность, и соответственно обновить / создать ее:
$em = $this->getEntityManager();
// Prevent race conditions by putting this into a transaction.
$em->transactional(function($em) use ($content, $type) {
// Use pessimistic write lock when selecting.
$counter = $em->createQueryBuilder()
->select('MyBundle:MyCounter', 'c')
->where('c.content = :content', 'c.type = :type')
->setParameters(['content' => $content, 'type' => $type])
->setLockMode(\Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
->getQuery()
->getResult()
;
// Update if existing.
if ($counter) {
$counter->increase();
} else {
// Create otherwise.
$newCounter = new Counter($content, $type, 1);
$em->persist($newCounter);
}
});
Если запись существует PESSIMISTIC_WRITE
удостоверяется, что она не обновляется никем (например, другими потоками), пока мы ее обновляем.
Несмотря на то, что вам нужно проверять существование сущности при каждом обновлении, это просто воспроизведение «обновите, если существует, и создайте, если нет».
Как указано в комментариях это не предотвращает состояние гонки, если запись не существует : если строка с одинаковыми ключами вставляется между выбранной и вставленной вами ' повторяется исключение дубликата ключа.
Но, учитывая ограничения, которые должны быть независимы от БД и, следовательно, написаны с использованием Doctrine и без использования собственного SQL, в некоторых случаях это может помочь.
Ссылки: