如何将指定嵌套SQL查询转换为Laravel Eloquent查询构造器?
转换后的Laravel Eloquent查询构造器实现
下面是对应你提供的SQL语句的两种Eloquent实现方式:
方式一:拆分子查询(更易读)
// 构建子查询:筛选出每个payment只出现一次的交易记录 $subQuery = \App\Models\Transaction::query() ->select('*') ->groupBy('payment') ->havingRaw('count(payment) = 1'); // 外层查询:统计符合时间区间的子查询结果数量 $count = \Illuminate\Support\Facades\DB::query() ->selectRaw('count(x.payment)') ->fromSub($subQuery, 'x') ->whereBetween('x.updated_at', ['2021-06-14', '2022-06-20']) ->value('count(x.payment)');
方式二:嵌套子查询(更紧凑)
$count = \Illuminate\Support\Facades\DB::query() ->selectRaw('count(x.payment)') ->fromSub(function ($query) { $query->from('transactions') ->select('*') ->groupBy('payment') ->havingRaw('count(payment) = 1'); }, 'x') ->whereBetween('x.updated_at', ['2021-06-14', '2022-06-20']) ->value('count(x.payment)');
关键对应说明
fromSub方法用于将子查询作为数据源,第二个参数对应原SQL中子查询的别名xhavingRaw直接沿用原SQL的having条件,避免Eloquent的语法限制whereBetween等价于SQL中的between ... AND ...语法value方法直接返回统计结果,无需处理额外的集合对象
内容的提问来源于stack exchange,提问作者cena_
相关产品推荐
相关产品推荐

