При вставке объекта с ассоциациями существует ли способ использовать FK вместо получения объекта?

Мне нужно вставить объект, имеющий ассоциации.

Если у меня уже есть FK связанных объектов, есть ли способ вставить первичный объект в db только с заполненным FK?

Или я всегда должен

  • извлекать связанные объекты через FK,
  • заполняют свойства первичной сущности, ссылаясь на ассоциации,
  • а затем вызвать метод persist.

    Вы хотите, чтобы ссылочный прокси

    Предположим, у меня есть сообщения и теги. Сообщение имеет множество тегов. Я получаю кучу тегов от пользователя, который проверил кучу флажков.

    Следующее добавило бы теги к существующей почте, не получая первую часть тега. Он делает это, используя ссылочные прокси, созданные 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();