Ребята, вопрос по доктрине, даже не знаю как его загуглить. Допустим

у меня в базе есть запись в таблице 'user':

id: 3
name: Jone

Далее я создаю в коде сущность: $user = (new User)->setId(3)->setName('Jone');
Как мне указать доктрине что эта сущность как будто бы получена из базы с помощью find(3) а не создана мной?

9 ответов

4 просмотра

Для того чтобы указать 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 будет представлять объединенный объект, готовый для использования в связях с другими сущностями.

Vladislav-Ashtaev Автор вопроса
Andrii Dembitskyi
Для того чтобы указать Doctrine, что ваша сущность...

Кажется это то что нужно! Спасибо огромное!

Vladislav-Ashtaev Автор вопроса
Volodymyr Melko
Merge зробить find під капотом ;)

значит от запроса он не избавляет

Vladislav-Ashtaev Автор вопроса
Volodymyr Melko
Кешуй доктриною

Да, это видимо самый правильный способ! Спасибо!

Andrii Dembitskyi
Для того чтобы указать Doctrine, что ваша сущность...

$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();

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

Обсуждают сегодня

Всем привет, Добавил в плагин определение user agent public function registerMarkupTags() { return [ 'filters' => [ 'staticPage' => ['RainLab\Pages\Cl...
John Norton Kruger
3
Я колись ставив гуглу антиспам 3.0, може і норм, але мені не дуже зайшло. Теж думав тиждень, що його і куди. Зупинився на трех варіантах відразу всі три і включив 1. Перевір...
𝓔𝓾𝓰𝓮𝓷𝓮𝓥 J
2
Всем привет, может кто знает нормальных иностранных хостинг провайдеров. Что бы по качеству аналогичные netangels, beget, timeweb?
Black Cat
4
Добрый день , слышали про то что XML схемы https://schemas.xmlsoap.org/soap/envelope/ перестали работать со поза-вчера. А домен https://schemas.xmlsoap.org/ , отвечает 404 оши...
Max Dubovsky
3
Второй вопрос: снимаются ли эти ограничения при покупке на fragment хрени за кучу денег? (до 4096 / 2048)
Артем Уколов
3
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Карта сайта