You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:57:04