При вставке объекта с ассоциациями существует ли способ использовать FK вместо получения объекта?
Мне нужно вставить объект, имеющий ассоциации.
Если у меня уже есть FK связанных объектов, есть ли способ вставить первичный объект в db только с заполненным FK?
Или мне всегда нужно
- извлекать связанные объекты через FK,
- заполняет основные свойства сущности, относящиеся к ассоциациям,
- а затем вызовите метод persist.
Ответы
Ответ 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();