在插入具有关联的实体时,是否有一种方法可以仅使用FK而不是检索该实体?

2020/12/30 23:41 · php ·  · 0评论

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

如果我已经具有关联实体的FK,是否可以将仅填充FK的主要实体插入数据库?

还是我总是必须

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

您需要参考代理

假设我有帖子和标签。一个帖子有很多标签。我从用户那里获得了一堆标签,该用户选中了一堆复选框。

以下将标记添加到现有帖子,而无需先获取每个标记实体。它使用参考代理生成,该参考代理由生成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();

关于使用参考代理

在我的调查中,这仅是部分解决方案,如下所示:

是的,您不必主动检索相关记录(因为创建了代理记录),但是当刷新(提交)更新事务时,它仍会首先执行select语句以检索相关记录,然后仅执行更新(全部击中数据库)。

这效率低下,因此不必要(我们有外键ID,为什么要检索记录..?)

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

我不确定目前是否有解决方案... ??

希望该理论体系将来会更新,如果使用代理逻辑,我们应该获得自动性能增强...

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

我假设您可以通过直接通过DBAL层访问数据库来手动指定关系,但是我不建议这样做,也没有尝试过。

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

$post = new Post();
$post->setPostCategory(['id' => 1]);
$em->persist($em->merge($post));
$em->flush();
本文地址:http://php.askforanswer.com/zaicharujuyouguanliandeshitishishifouyouyizhongfangfakeyijinshiyongfkerbushijiansuogaishiti.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!