Подтвердить что ты не робот

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Вы должны получить связанный объект и сделать связь.

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

Ответ 4

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

$post = new Post();
$post->setPostCategory(['id' => 1]);
$em->persist($em->merge($post));
$em->flush();