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

如何将指定SQL查询转换为Laravel Eloquent实现语句?

把你的SQL查询转换为Laravel Eloquent语句

没问题,我来帮你把这段SQL转换成Laravel Eloquent写法,先理清楚原查询的核心逻辑:它通过两个子查询分别提取每个AGENT_ID在指定日期的首次登录时间和最后登出时间,再将两个结果左连接,最终得到包含代理ID、首次登录、最后登出的数据集。

步骤1:定义子查询

首先我们用Eloquent的查询构造器分别实现两个子查询:

use Illuminate\Support\Facades\DB;
use App\Models\DatamartAgentDetail; // 假设你的模型对应这个表,可根据实际调整

// 子查询t1:获取每个代理的首次登录时间
$firstLoginSubquery = DatamartAgentDetail::select('AGENT_ID', DB::raw('MIN(EVENT_TIME) as First_Login'))
    ->whereIn('GRP_DBID', ['3'])
    ->whereBetween('EVENT_TIME', ['2018-03-18 00:00:00', '2018-03-18 23:59:59'])
    ->where('EVENT', 'LOGIN')
    ->groupBy('AGENT_ID');

// 子查询t2:获取每个代理的最后登出时间(原SQL中你没写完EVENT条件,这里根据逻辑补为LOGOUT)
$lastLogoutSubquery = DatamartAgentDetail::select('AGENT_ID', DB::raw('MAX(EVENT_TIME) as last_logout'))
    ->whereIn('GRP_DBID', ['3'])
    ->whereBetween('EVENT_TIME', ['2018-03-18 00:00:00', '2018-03-18 23:59:59'])
    ->where('EVENT', 'LOGOUT')
    ->groupBy('AGENT_ID');

步骤2:左连接子查询并获取结果

接下来把两个子查询左连接,得到最终结果:

$finalResult = DB::table($firstLoginSubquery, 't1')
    ->leftJoinSub($lastLogoutSubquery, 't2', function ($join) {
        $join->on('t1.AGENT_ID', '=', 't2.AGENT_ID');
    })
    ->select('t2.AGENT_ID', 't1.First_Login', 't2.last_logout')
    ->get();

补充说明

  • 原SQL中t1用order by event_time asc再group by的方式取首次登录,等价于用MIN(EVENT_TIME)聚合函数,这种写法在Eloquent中更简洁高效,也避免了一些数据库的分组歧义问题。
  • 如果你没有创建对应模型,也可以直接用DB::table('datamart_agent_details')替代DatamartAgentDetail::来写子查询。
  • 注意替换模型命名空间为你项目中的实际路径,如果不需要模型,直接用DB门面操作表即可。

内容的提问来源于stack exchange,提问作者ahmed.taha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:00:03