如何将指定原生SQL查询转换为Laravel Eloquent结构化查询
Laravel Eloquent 原生SQL转换方案
首先你需要先创建对应orders表的Eloquent模型(通常为App\Models\Order),转换后的查询代码如下:
use App\Models\Order; // 取出阈值参数,避免直接拼接SQL产生注入风险 $timeSlotLimit = $timeSlotData->time_slot_max_limit; $orders = Order::select('id') ->whereIn(['start_time', 'end_time'], function ($query) use ($timeSlotLimit) { $query->select('start_time', 'end_time') ->from('orders') ->groupBy('start_time', 'end_time') ->havingRaw('COUNT(*) >= ?', [$timeSlotLimit]); }) ->get();
扩展操作说明
- 新增额外where条件
直接在查询链上追加对应where方法即可,支持加在主查询或子查询中。比如要筛选近7天的订单,可在主查询追加:
如果要子查询仅统计已支付订单的时间槽数量,可在子查询的->where('created_at', '>=', now()->subDays(7))groupBy前追加:->where('pay_status', 'paid') - 关联模型查询
首先需要在Order模型中预先定义好对应的关联关系,示例:
之后在查询链中使用// App/Models/Order.php 中添加关联定义 public function user() { return $this->belongsTo(User::class); } public function items() { return $this->hasMany(OrderItem::class); }with方法即可预加载关联数据:->with(['user', 'items']) - 动态拼接查询
可以将基础查询保存为查询构造器实例,后续根据业务逻辑动态追加条件:// 初始化基础查询 $baseQuery = Order::whereIn(['start_time', 'end_time'], function ($query) use ($timeSlotLimit) { $query->select('start_time', 'end_time') ->from('orders') ->groupBy('start_time', 'end_time') ->havingRaw('COUNT(*) >= ?', [$timeSlotLimit]); }); // 动态判断追加条件 if (request()->has('user_id')) { $baseQuery->where('user_id', request()->input('user_id')); } // 最终获取结果 $orders = $baseQuery->with('user')->get();
内容的提问来源于stack exchange,提问作者Wcan
相关产品推荐
相关产品推荐

