如何在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
相关产品推荐
相关产品推荐

