2015-04-23 94 views
2

下面是一个简单的MySQL查询我想在Symfony2的项目中使用:Symfony的MySQL的子查询的最佳实践:母语,QueryBuilder的或DQL

SELECT * FROM 
(
    SELECT n.sdate, n.edate FROM `news` n 
    UNION 
    SELECT ss.sdate, ss.edate FROM `stagesession` ss 
) AS sub 
ORDER BY sub.sdate 

事实上,这个查询会更复杂一些,有更多的别名,过滤器和与其他表的连接。

我是否必须在DQL查询中将其转换为createQueryBuilder,或者最好的方法是简单地使用doctrine中的createNativeQuery?

+1

上面的一些查询本质上是复杂的,最好使用本机查询而不是查询生成器。 –

回答

1

我与学说的个人最好的做法是:

查询(QB与DQL与SQL):

  • 使用QB如果建立查询不仅仅是传递一些参数的详细条件,像if($onlyActive) $qb->andWhere('x.type = 5');(我不喜欢字符串连接东西)
  • 使用QB出于兼容性考虑到分页工具包
  • 使用DQL简单选择
  • 如果DQL查询不可能使用SQL(例如DB-本地表达式MySQL/Oracle/MSSQL,一些奇怪的统计数据或带有UNION或巨大子查询的hacky查询)
  • 至少你也可以使用SQL,如果你使用的是一个非常庞大的数据库的小数据子集一些插件软件),因为如果数据库架构非常小,您可以从中创建一些实体并将它们重新验证(例如在部署时)作为系统测试。但是,如果它太复杂,那么QB或DQL对于访问这样的数据库也是过分的,因为你必须定义要工作的实体。

结果(ORM与平):在业务代码

  • 使用ORM尽可能拥有最大。可读的代码(考虑延迟加载)在复杂的嵌套视图
  • 使用ORM(没有巨大的表)有漂亮干净的代码在你的模板(考虑预先加载)为只读表/列表
  • 使用平板阵列使用时,用大量的数据(和缓存是不可能的)

而且总是处理优化的原因平阵列记住,你应该先写一些简单的代码,并当且仅当它是慢,与急切/延迟加载优化它,查询/结果缓存,HTTP缓存和至少如果你例如处理一些数据库同步或数据导入程序,您可能使用平面数组或返回到本机实现,但不要低估ORM;)。