我目前正在使用Symfony 3进行开发,并且我想知道在以下情况下最佳做法是什么(如果有):
假设我有客户和订单实体,每个订单都链接到一个客户。 如果我想按客户计算订单总和,最好的方法是什么?
感谢您的帮助,祝您度过愉快的一天
答案 0 :(得分:0)
请注意以下是我的观点,因为官方学说最佳实践中没有提及。
客户端类中的一个函数,它解析客户端的命令以对它们求和并返回结果
这将导致从数据库加载所有相关订单,除非您将该集合标记为“额外延迟”(Extra Lazy Associations)。但在我看来,你不应该这样做,只要你不管怎样就不用整个系列。
订单存储库中的函数,将客户端作为参数并返回标量结果(... SUM(order.value)WHERE order.client =:client)...)
这应该是要走的路。您将所有“繁重的工作”放入Repository类中,并且您的应用程序不需要知道存储库如何获取订单计数。此外,您不会使用附加功能混淆您的实体类(因为它们应该只包含数据,更多特定请求应该由存储库处理)。
存储库中的一个函数,它返回客户端的所有订单,然后对控制器中的值进行求和
这将加载与变体1类似的所有实体,因此除非您想要与所有实体一起使用,否则不要这样做。
答案 1 :(得分:0)
尽管这句话很受欢迎,但没有客观的“最佳实践”。它总是主观的,总是取决于你的具体问题。这就是为什么这些问题往往不受欢迎,被投票和关闭。
从域驱动设计的角度来看,这将是理想的。业务实体中的业务逻辑。问题是您认为客户将累积多少订单,因为此方法需要加载给定客户的所有订单。几十个订单?可能还不错。几千个订单?可能会开始放慢速度。也许你可以从这种方法开始,然后随着系统的发展进行重构?
这似乎非常有效。另一方面,它开始将一些客户端功能泄漏到订单域。如果最终散布着许多这些特殊功能,可能会变得难以维护。但如果这是唯一一个那么它可能就好了。
抓取所有订单与第一个解决方案具有相同的扩展问题。你真的需要完整的订单来总结吗?到底是什么意思总结呢?将业务功能放在控制器中通常不是一件好事。如果您还需要在其他地方计算总和,该怎么办?另一方面,它是Symfony,相当多的Symfony应用程序确实拥有相当胖的控制器,具有充足的业务逻辑并且工作得很好。因此,如果它适用于您的应用程序的其余部分,这可能是最好的方法。
虽然你没有提到它,但也有可能创建ClientOrder服务。
但是在一天结束时,这确实是你的决定。没有神奇的最佳实践会有所帮助。我建议编写一些测试只是为了使重构变得更容易,然后选择一种满足当前需求的方法并继续进行。