Sql 关于学说和符号的最佳做法

Sql 关于学说和符号的最佳做法,sql,symfony,doctrine-orm,Sql,Symfony,Doctrine Orm,我想知道ORM中两种方法之间的优化更可取的方法是什么 我用我的对象的条件创建一个QueryBuilder,并获得一个关于我的查询条件的对象数组 使用getDoctrine()->findAll()获取所有对象,然后在php中检查我对对象应用的条件 我想知道,尤其是在酒店预订和一些房间的可用性方面。这种搜索包括许多具有复杂查询的不同实体。一想到querybuilder我就头疼。。。但是我不确定这是用php填充所有实体然后应用我的函数的最佳方式……我认为创建QueryBuilder(或者简单地编

我想知道ORM中两种方法之间的优化更可取的方法是什么

  • 我用我的对象的条件创建一个QueryBuilder,并获得一个关于我的查询条件的对象数组
  • 使用
    getDoctrine()->findAll()
    获取所有对象,然后在php中检查我对对象应用的条件

我想知道,尤其是在酒店预订和一些房间的可用性方面。这种搜索包括许多具有复杂查询的不同实体。一想到querybuilder我就头疼。。。但是我不确定这是用php填充所有实体然后应用我的函数的最佳方式……

我认为创建
QueryBuilder
(或者简单地编写一个DQL查询)来获得结果总是更好的

当您通过
getDoctrine()->findAll()
调用获取所有对象时,将创建一个PHP对象,并为每个结果设置其值。然后你的PHP脚本(当然比数据库慢)只会保存有趣的对象,你会有很多garbadge


当您使用
QueryBuilder
时,数据库会优化查询的处理并只返回感兴趣的对象。您可以避免大量对象实例,不需要使用PHP筛选结果。

通常,您应该通过使用查询生成器生成的查询来获取所需的对象。您不应该通过
->findAll()
获取所有实体,然后使用php进行过滤,因为这可能会占用大量资源—假设您的数据库中有1000000个条目

如果您查看的是酒店预订和房间可用性—您将编写一个只返回具有房间可用性的对象的查询—而不是使用php检查所有对象


我写了一篇博客文章,介绍了一些关于信条的最佳实践,可以在这里找到-

我真的不理解这个问题。常见的模式是拥有一个服务类,您可以调用该服务类来获取与特定类型匹配的实体。e、 g.$rooms=$bookingService->getUnbokedRoomsForDaterRange($datetime1,$datetime2)。你在这个函数中做什么取决于你(使用DQL,一个查询生成器,SQL或者通过Web服务拉入它…),我也不理解这个问题。