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

如何在Laravel中编写子查询?现有MySQL查询需转换为子查询

Laravel 查询构造器实现对应MySQL子查询

方法一:闭包子查询(最直观)

直接在whereIn中传入闭包定义子查询,完全对应原SQL逻辑:

use Illuminate\Support\Facades\DB;

$transactionData = DB::table('transaction_logs')
    // 选择需要的字段,用DB::raw处理日期格式化和聚合函数
    ->select(DB::raw('DATE(dateCreated) AS date'), DB::raw('SUM(amount) AS newPay'))
    // 日期范围条件,也可拆分为两个where分别判断>=和<=
    ->whereBetween(DB::raw('DATE(dateCreated)'), ['2022-10-01', '2022-10-05'])
    // 定义IN子查询:匹配users表中的phone
    ->whereIn('phone', function ($subQuery) {
        $subQuery->select('phone')->from('users');
    })
    // 按日期分组
    ->groupBy(DB::raw('DATE(dateCreated)'))
    // 执行查询并获取结果
    ->get();

方法二:提前定义子查询变量

如果子查询逻辑复杂,可先单独定义再传入,代码更清晰:

use Illuminate\Support\Facades\DB;

// 先定义子查询
$validPhones = DB::table('users')->select('phone');

$transactionData = DB::table('transaction_logs')
    ->selectRaw('DATE(dateCreated) AS date, SUM(amount) AS newPay')
    ->whereRaw('DATE(dateCreated) >= ? AND DATE(dateCreated) <= ?', ['2022-10-01', '2022-10-05'])
    ->whereIn('phone', $validPhones)
    ->groupByRaw('DATE(dateCreated)')
    ->get();

方法三:使用Eloquent模型(若有对应Model)

如果已经创建了TransactionLog模型,可通过Eloquent实现:

use App\Models\TransactionLog;

$transactionData = TransactionLog::selectRaw('DATE(dateCreated) AS date, SUM(amount) AS newPay')
    ->whereBetween(DB::raw('DATE(dateCreated)'), ['2022-10-01', '2022-10-05'])
    ->whereIn('phone', function ($subQuery) {
        $subQuery->select('phone')->from('users');
    })
    ->groupByRaw('DATE(dateCreated)')
    ->get();

说明:

  • selectRaw/whereRaw/groupByRaw可直接写入原生SQL片段,简化代码;
  • 所有写法最终生成的SQL与你提供的原生查询完全一致,可通过toSql()方法查看生成的SQL语句验证。

内容的提问来源于stack exchange,提问作者ayesha maqsood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:35:14