如何将原生 SQL 查询转换为 Laravel Eloquent 查询

发布时间 - 2025-12-31 00:00:00    点击率:

本文详解如何将统计最近 30 天每日浏览量的原生 sql 查询,准确、高效地转换为 laravel 的 query builder 写法(注意:该场景更适合用 query builder 而非 eloquent 模型,因无需模型逻辑且涉及聚合与日期函数)。

在 Laravel 中,将原生 SQL 转换为可维护、安全的查询时,应优先使用 DB::table()(即 Query Builder),而非强行套用 Eloquent 模型——尤其当查询聚焦于聚合、分组和数据库函数(如 DATE())时。Eloquent 更适用于单模型操作与关系映射,而本例本质是面向 views 表的聚合统计,直接使用 Query Builder 更简洁、语义更清晰。

以下是正确且可运行的 Laravel 实现:

use Illuminate\Support\Facades\DB;

$stats = DB::table('views')
    ->selectRaw('DATE(created_at) as day, COUNT(*) as titles')
    ->where('view_type', 'App\\Title')
    ->groupByRaw('DATE(created_at)')
    ->orderByRaw('DATE(created_at) DESC')
    ->limit(30)
    ->get();

关键修正说明

  • 使用 selectRaw() 替代字符串拼接字段,避免引号/转义错误,并确保 DATE(created_at) 被原样传递至 SQL;
  • groupByRaw('DATE(created_at)') 是必须的——仅 groupBy('created_at') 会按完整时间戳(含时分秒)分组,导致同一天多条记录被拆分为多组;
  • orderByRaw() 保证按日期降序排序,而非按原始 created_at 时间戳(否则可能因同一日多条记录排序不稳定);
  • view_type 值中的反斜杠需双写 'App\\Title',PHP 字符串中 \T 会被转义,双反斜杠确保实际传入 'App\Title';
  • 不建议使用 ->get() 返回集合后在 PHP 中截取前 30 条,务必让数据库执行 LIMIT 30 以提升性能。

⚠️ 注意事项

  • 若需兼容 MySQL 8.0+ 或 PostgreSQL,可考虑 DATE_TRUNC('day', created_at)(PostgreSQL)或 DATE(created_at)(MySQL)——Laravel 默认适配 MySQL,上述写法已足够;
  • 如项目已定义 View 模型,仍不推荐用 View::select(...)->groupBy(...)->get(),因为 Eloquent 会自动添加 id 等默认字段并干扰 GROUP BY,易触发 SQL 错误(如 ONLY_FULL_GROUP_BY);
  • 生产环境建议为 view_type 和 created_at 字段添加联合索引,显著加速 WHERE + GROUP BY 查询:
ALTER TABLE `views` ADD INDEX `idx_view_type_created_at` (`view_type`, `created_at`);

通过以上写法,你不仅完成了语法转换,更获得了可读性强、可测试、防 SQL 注入且性能可控的 Laravel 风格查询。


# mysql  # php  # laravel  # cad  # app  # sql  # select  # date  # 字符串  # table  # postgresql  # 数据库  # 而非  # 转换为  # 多条  # 适用于  # 不稳定  # 更适合  # 如何将  # 浏览量  # 同一天  # 按原 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  如何快速上传建站程序避免常见错误?  如何用IIS7快速搭建并优化网站站点?  浅谈javascript alert和confirm的美化  php json中文编码为null的解决办法  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Python高阶函数应用_函数作为参数说明【指导】  香港服务器部署网站为何提示未备案?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  JS中对数组元素进行增删改移的方法总结  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  WordPress 子目录安装中正确处理脚本路径的完整指南  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何在Ubuntu系统下快速搭建WordPress个人网站?  Linux网络带宽限制_tc配置实践解析【教程】  Linux系统命令中screen命令详解  Laravel中的withCount方法怎么高效统计关联模型数量  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何在万网开始建站?分步指南解析  昵图网官方站入口 昵图网素材图库官网入口  如何在自有机房高效搭建专业网站?  如何快速搭建高效简练网站?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  教你用AI润色文章,让你的文字表达更专业  如何在阿里云高效完成企业建站全流程?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Swift开发中switch语句值绑定模式  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  浅谈redis在项目中的应用  在Oracle关闭情况下如何修改spfile的参数  Laravel怎么使用Intervention Image库处理图片上传和缩放  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel怎么上传文件_Laravel图片上传及存储配置  如何在IIS中新建站点并配置端口与物理路径?  详解Android图表 MPAndroidChart折线图  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  网站建设保证美观性,需要考虑的几点问题!  焦点电影公司作品,电影焦点结局是什么?