Мне нужно вставить объект, имеющий ассоциации.
Если у меня уже есть FK связанных объектов, есть ли способ вставить первичный объект в db только с заполненным FK?
Или я всегда должен
Вы хотите, чтобы ссылочный прокси
Предположим, у меня есть сообщения и теги. Сообщение имеет множество тегов. Я получаю кучу тегов от пользователя, который проверил кучу флажков.
Следующее добавило бы теги к существующей почте, не получая первую часть тега. Он делает это, используя ссылочные прокси, созданные EntityManager::getReference()
:
$tag_ids = $_POST['tag_id']; // an array of integers representing tag IDs. $post = $em->getRepository('Post')->find($post_id); // returns a Post entity. foreach($tags_ids as $tid){ $post->addTag($em->getReference('Tag',$tid)); } $em->persist($post); $em->flush();
Что касается использования ссылочного прокси
В моих исследованиях это лишь частично решение:
Да, вам не нужно активно получать связанную запись (потому что вы создаете прокси-запись), но когда вы завершаете (фиксируете) транзакцию обновления, она по-прежнему сначала выполняет оператор select для извлечения связанной записи, а затем только делает обновление (все в одном попадании в db).
Это неэффективно и не нужно (у нас есть идентификатор внешнего ключа, зачем извлекать запись …?)
Поэтому, хотя это не полное решение, вы получаете только одно соединение с базой данных (что хорошо) и немного упрощенным кодом.
Я не уверен, есть ли на данный момент решение …?
Будем надеяться, что учения в доктринах будут обновляться в будущем, и если использовать логику прокси-сервера, мы должны получить автоматическое повышение производительности …
Вы должны получить связанный объект и установить связь.
Я предполагаю, что вы могли бы вручную указать отношения, напрямую обращаясь к базе данных через уровень DBAL, но я бы не рекомендовал этого, и я не пробовал это.
Вы можете сделать это, используя entityManager :: merge
$post = new Post(); $post->setPostCategory(['id' => 1]); $em->persist($em->merge($post)); $em->flush();