将原生 SQL 查询转换为 Laravel Eloquent 查询的完整指南
技术百科
聖光之護
发布时间:2025-12-31
浏览: 次 本文详解如何将统计“过去 30 天每日浏览量”的原生 sql 转换为 laravel 的 query builder 写法,涵盖日期截取、分组聚合、排序限制等关键点,并指出常见陷阱与最佳实践。
在 Laravel 中,直接使用 DB::table()(即 Query Builder)是处理此类聚合查询最清晰、高效的方式——相比强行套用 Eloquent 模型,它更贴近 SQL 语义,且避免了模型层不必要的开销。
但需注意:您提供的原始答案中存在严重语法错误,会导致查询失败或结果异常。例如:
- ❌ "date ('created_at')" —— 错误的字符串拼接,date() 是 MySQL 函数,不能加引号;
- ❌ groupBy("created_at") —— 按完整时间戳分组 ≠ 按日期分组,将导致每天多条记录(因 created_at 含时分秒);
- ❌ orderBy("created_at","desc") —— 应按日期排序,而非带精度的时间戳,否则分组后排序逻辑错乱;
- ❌ 缺少 DATE() 函数的正确用法及数据库兼容性处理。
✅ 正确写法(兼容 MySQL)如下:
use Illuminate\Support\Facades\DB;
$viewsByDay = DB::table('views')
->selectRaw('DATE(created_at) as day, COUNT(*) as titles')
->where('view_type', 'App\\Title')
->groupBy('day') // 按别名分组(MySQL 支持),或改用 selectRaw 中的表达式
->orderBy('day', 'desc')
->limit(30)
->get();? 关键说明:
- selectRaw() 用于注入原生 SQL 表达式,DATE(created_at) 精确提取日期部分(如 '2025-05-20');
- groupBy('day') 利用 MySQL 对 SELECT 别名的支持,简洁安全;若需跨数据库兼容(如 PostgreSQL),应改为 groupBy(DB::raw('DATE(created_at)'));
- orderBy('day', 'desc') 确保按自然日期倒序排列(最新日优先);
- limit(30) 控制返回条数,符合需求。
? 进阶建议:
- 若项目已定义 View 模型,可配合 toBase() 获取查询构造器,但无实质优势;
- 需补全时间范围(如近 30 天内有数据才显示)?可追加 whereBetween('created_at', [now()->subDays(30), now()]);
- 返回结果中 day 是字符串,如需 Carbon 实例,可在集合中映射转换:->map(fn ($item) => tap($item, fn ($i) => $i->day = \Carbon\Carbon::parse($i->day)))。
总结:Query Builder 是处理复杂聚合查询的首选工具。牢记 selectRaw + groupBy + orderBy 的协同逻辑,避开字符串误引、分组粒度错误等典型坑,即可精准复现原生 SQL 语义。
# 进阶
# 可在
# 此类
# 而非
# 如需
# 如何将
# app
# 内有
# 工具
# 字符串
# 数据库
# 排列
# map
# cad
# select
# mysql
# sql
# postgresql
# 转换为
# laravel
# table
# date
# 多条
# carbon
# 应按
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11如何卸载OneDrive_Win11卸载
- php查询数据怎么导出csv_查询结果转csv文件
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- c# await 一个已经完成的Task会发生什么
- Windows怎样拦截WPS弹窗广告_Window
- Win11怎么查看wifi信号强度_检测Windo
- 如何在 Go 中正确测试带 Cookie 的 HT
- Win11资源管理器卡顿怎么办 Win11文件资源
- 小程序里php怎么变mp4_小程序调用php生成m
- win11 OneDrive怎么彻底关闭 Win1
- c++中的CRTP是什么 c++奇异递归模板模式【
- Python集合操作技巧_高效去重解析【教程】
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11开机Logo怎么换_Win11自定义启动
- Python函数参数高级用法_默认值与可变参数解析
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- Win11如何关闭小娜Cortana Win11禁
- Win11怎么关闭系统推荐内容_Windows11
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- 如何使用正则表达式批量替换重复的 *- 模式为固定
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- Win11如何设置省电模式 Win11开启电池节电
- 如何在Golang中实现微服务服务拆分_Golan
- Win11怎么设置默认PDF阅读器 Win11修改
- 如何使用Golang操作指针变量_Golang解引
- c++如何用AFL++进行模糊测试 c++ Fuz
- Windows10电脑怎么设置电源按钮_Win10
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Win11开机速度慢怎么优化_Win11系统启动加
- LINUX怎么查看进程_LINUX ps命令查看运
- php中self::能调用子类重写的方法吗_静态绑
- c++ atoi和atof函数用法_c++字符数组
- 如何在Golang中处理二进制数据_Golang
- C#如何序列化对象为XML XmlSerializ
- Win11如何开启telnet服务 Win11启用
- Win11怎么设置应用分屏_Windows11贴靠
- Python深度学习实战教程_神经网络模型构建与训
- mac本地php环境如何开启curl_curl扩展
- Win10电脑怎么设置网络名称_Windows10
- c++ reinterpret_cast怎么用 c
- 如何解决Windows字体显示模糊的问题?(Cle
- Win11更新后变慢怎么办_Win11系统更新后卡
- PHP cURL GET请求:正确设置请求头与身份
- Win10电脑C盘红了怎么清理_Windows10
- Win11怎么打开旧版计算器_Win11恢复传统计
- Win11时间怎么同步到原子钟 Win11高精度时
- Win11如何设置开机问候语 Win11修改登录界
- 如何提升Golang程序I/O性能_Golang

QQ客服