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

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

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

或者我总是不得不这样做

  • 通过FK检索相关的实体,
  • 根据关联填充主实体的属性,
  • 然后调用persist方法。

你想要一个引用代理

假设我有post和标签。 一篇文章有​​许多标签。 我从用户那里得到一堆标签,他们勾选了一堆checkbox。

以下内容会将标签添加到现有post中,而不会先取得每个标签实体。 它通过使用由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(); 

关于使用引用代理
在我的调查中,这只是部分解决scheme,如下所示:

是的,您不必主动检索相关logging(因为您创build了代理logging),但是当您刷新(提交)更新事务时,它仍然会首先执行select语句来检索相关logging,更新(所有在一个命中的数据库)。
这是低效的,不应该是必要的(我们有外键的ID,为什么检索logging..?)

所以,虽然不是一个完整的解决scheme,但是你所获得的只是一个到数据库的连接(这很好),而且代码稍微简化了。

我不确定目前是否有解决scheme?
希望在未来的教条bods将更新,如果使用代理逻辑,我们应该获得自动性能增强…

您应该检索要关联的实体并build立关系。

我假设你可以通过DBAL层直接访问数据库来手动指定关系,但我不会推荐这个,也没有尝试过。

你可以使用entityManager :: merge来做到这一点

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