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

