у меня в базе есть запись в таблице 'user':
id: 3
name: Jone
Далее я создаю в коде сущность: $user = (new User)->setId(3)->setName('Jone');
Как мне указать доктрине что эта сущность как будто бы получена из базы с помощью find(3) а не создана мной?
Для того чтобы указать Doctrine, что ваша сущность уже существует в базе данных и не требует сохранения, вы можете использовать метод EntityManager'а merge(). Этот метод позволяет объединить состояние вашего объекта с состоянием, полученным из базы данных. Вот как это можно сделать: php $user = (new User)->setId(3)->setName('Jone'); $entityManager->merge($user); В этом примере $entityManager представляет ваш экземпляр EntityManager, который отвечает за управление сущностями в Doctrine. Вызов метода merge() скажет Doctrine, что ваш объект $user представляет уже существующую запись в базе данных. Doctrine выполнит запрос на поиск записи с указанным идентификатором и заменит состояние вашего объекта на состояние из базы данных. Теперь, когда вы добавляете эту сущность в качестве связи к другой сущности, Doctrine будет понимать, что она уже существует в базе данных и не будет пытаться сохранять ее. Обратите внимание, что метод merge() также вернет объединенный объект, поэтому вы можете присвоить его переменной, если это необходимо: php $user = (new User)->setId(3)->setName('Jone'); $user = $entityManager->merge($user); Теперь $user будет представлять объединенный объект, готовый для использования в связях с другими сущностями.
Кажется это то что нужно! Спасибо огромное!
Merge зробить find під капотом ;)
значит от запроса он не избавляет
Кешуй доктриною
Да, это видимо самый правильный способ! Спасибо!
$user = $this->entityManager->getRepository(User::class)->find(3) ?: new User(); $user->setId(3)->setName('Jone'); $this->entityManager->persist($user); $this->entityManager->flush();
$user = $entityManager->getRepository(User::class)->find(3) ?: new User(); $user->setId(3)->setName('Jone'); $entityManager->persist($user); $entityManager->flush();
Обсуждают сегодня