При вставке сущности с ассоциациями есть ли способ просто использовать FK вместо извлечения сущности? - PullRequest
38 голосов
/ 21 марта 2011

Мне нужно вставить сущность, которая имеет ассоциации.

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

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

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

Ответы [ 4 ]

64 голосов
/ 24 марта 2011

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

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

Следующее добавит теги к существующему сообщению без предварительной выборки каждого объекта тега. Это делается с помощью ссылочных прокси, сгенерированных 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();
4 голосов
/ 06 апреля 2011

В отношении использования эталонного прокси
В моих исследованиях это только частично решение, а именно:

Да, у вас нетпроактивно извлекать связанную запись (потому что вы создаете прокси-запись), но когда вы сбрасываете (фиксируете) транзакцию обновления, она все равно сначала выполняет оператор выбора для извлечения связанной записи, а затем выполняет только обновление (все в одномударить по БД).
Это неэффективно и не должно быть необходимым (у нас есть идентификатор внешнего ключа, зачем извлекать запись ..?)

Так что, хотя это и не полное решение, что вы делаетевыгода - только единственное соединение с базой данных (что хорошо) и немного упрощенный код.

Я не уверен, есть ли решение для этого на данный момент ... ??
Надеемся, что тела доктрины обновятся в будущем, и если с помощью прокси-логики мы получим автоматическое повышение производительности...

0 голосов
/ 13 июля 2016

Вы можете сделать это, используя entityManager :: merge

$post = new Post();
$post->setPostCategory(['id' => 1]);
$em->persist($em->merge($post));
$em->flush();
0 голосов
/ 22 марта 2011

Вы должны получить сущность, которая должна быть связана, и установить связь.

Полагаю, вы могли бы вручную указать отношения, напрямую обращаясь к базе данных через уровень DBAL, но я бы не рекомендовал это, и при этом я не пробовал.

...