插入具有关联的实体时,有没有办法只使用 FK 而不是检索实体?

2022-08-30 12:29:53

我需要插入一个具有关联的实体。

如果我已经拥有关联实体的 FK,有没有办法将主实体插入到数据库中,只填充 FK?

还是我总是必须

  • 通过 FK 检索关联的实体,
  • 填充引用关联的主实体的属性,
  • ,然后调用持久化方法。

答案 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 语句来检索相关记录,然后仅执行更新(一次命中数据库)。
这是低效的,不应该是必要的(我们有外键ID,为什么要检索记录..?)

因此,虽然不是一个完整的解决方案,但您获得的只是与数据库的单个连接(这很好)和稍微简化的代码。

我不确定目前是否有解决方案...??
希望该原则将在将来更新,如果使用代理逻辑,我们应该获得自动性能增强...


推荐