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

如何将原生SQL转换为Laravel查询?to_date函数执行异常

问题:原生Oracle SQL转Laravel查询构建器时to_date函数处理问题

原生可运行SQL

select n_reserva,cod_hab_r1,cod_hab_r2,cod_hab_r3,fecha_reserva,fecha_entrada,fecha_salida,tour,dni_r,nombre,apellidos
from reservadas
join huespedes on huespedes.dni=reservadas.dni_r
where fecha_entrada=(select to_date(sysdate) from dual);

尝试的Laravel代码(存在执行问题)

DB::table('reservadas')
->select('n_reserva','cod_hab_r1','cod_hab_r2','cod_hab_r3','fecha_reserva',
'fecha_entrada','fecha_salida','tour','dni_r','nombre','apellidos')
->join('huespedes','huespedes.dni','=','reservadas.dni_r')
->where('fecha_entrada','=',function($query){
        $query->from('dual')
        ->select(DB::raw("to_date(sysdate)"));
    })
->get();

解决方案

方法一:简化写法(推荐)

Oracle中select to_date(sysdate) from dual等价于直接使用to_date(sysdate),可以直接将该表达式通过DB::raw传入where条件,无需嵌套子查询:

DB::table('reservadas')
    ->select('n_reserva', 'cod_hab_r1', 'cod_hab_r2', 'cod_hab_r3', 'fecha_reserva',
             'fecha_entrada', 'fecha_salida', 'tour', 'dni_r', 'nombre', 'apellidos')
    ->join('huespedes', 'huespedes.dni', '=', 'reservadas.dni_r')
    ->where('fecha_entrada', '=', DB::raw('to_date(sysdate)'))
    ->get();

方法二:修正子查询写法

如果需要保留原SQL的子查询结构,需调整where方法的传参方式——Laravel中当用闭包子查询作为条件时,无需显式写=,直接将闭包传入where方法即可:

DB::table('reservadas')
    ->select('n_reserva', 'cod_hab_r1', 'cod_hab_r2', 'cod_hab_r3', 'fecha_reserva',
             'fecha_entrada', 'fecha_salida', 'tour', 'dni_r', 'nombre', 'apellidos')
    ->join('huespedes', 'huespedes.dni', '=', 'reservadas.dni_r')
    ->where('fecha_entrada', function($query) {
        $query->select(DB::raw('to_date(sysdate)'))->from('dual');
    })
    ->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:50:36