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

