gpt4 book ai didi

php - 具有 OneToMany 关系的 Symfony 5.3 空集合

转载 作者:行者123 更新时间:2023-12-05 05:54:09 24 4
gpt4 key购买 nike

我的 Symfony 5 项目有 2 个实体:客户端和模板。每个Client有一个或多个模板(OneToMany),每个模板只关联一个Client(ManyToOne)。我在 Client.php 中有一个 getTemplates() 函数,它返回模板集合。

我遇到的问题是,当我调用 getTemplates() 函数时,我从以下位置运行它:

$client = $entityManager->getRepository(Client::class)->find($id);
$templates = $client->getTemplates();

我正在获取一个initialized = false 集合。

据我所知,为了避免不必要的请求,Symfony 创建了一个 Template 代理对象,它是 null。为了完成这项工作,我可以添加 fetch="EAGER"

@ORM\OneToMany(targetEntity=Template::class, mappedBy="Client", orphanRemoval=true, fetch="EAGER")

添加这个基本上使请求成为“真正的”模板对象(更多信息 here )。

我想做的是让我的 getTemplates 工作当我像这里一样检索我的所有客户时不必请求所有模板(有时我只需要显示所有客户,并请求之后来自某个客户的模板):

$templateRepository->findAll()

我知道如何解决我的问题,我只是想用最好的方法来解决这个问题,同时对我的数据库有最少的请求(基本上只有在我需要的时候调用它)。

总而言之,我想:

  • findAll() 我的客户而不检索​​与客户关联的模板
  • findAll() 我的模板并获取相关的客户端 - 这在我添加 fetch="EAGER"时有效,因为我得到了一个对应于正确客户端的“所有者”

最佳答案

正如 Yassinefikri 所解释的,默认的 Symfony 行为是不请求链接的实体以避免性能不佳。

要解决这个问题,您需要在存储库中有一个适当的函数,您可以在其中获取客户端并将它们与它们的模板结合起来。

这允许获取所有客户端没有他们的模板,但也能够获取所有他们模板的客户端,无论您是否需要。

通过添加 fetch="EAGER" 来改变 Symfony 的默认行为不是好的做法,你应该总是为想要的结果创建一个函数而不是改变默认行为(这会降低性能,特别是如果你正在处理一个大数据库)。

- 编辑,解决问题的更好(和更优化)方法

正如 Will B 所说,行为来自 Doctrine ORM 而不是 Symfony (Symfony 经常与 Doctrine ORM 一起使用,但这通常适用于 ORM)

另一种(也是更好的)实现预期结果的方法是初始化对象(这将获取链接的实体而不实际向数据库发出JOIN请求 - initializeObject()) .

总结

如果可以,永远不要使用 fetch="EAGER",因为这确实是处理链接实体的工作方式,最好使用 Will B'sYassinefikri's 解决问题。

关于php - 具有 OneToMany 关系的 Symfony 5.3 空集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69705859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com