Laravel Eloquent转换SQL报错:stripos()参数应为字符串而非对象
问题:Laravel Eloquent转换SQL查询时出现stripos参数错误
原始SQL查询
SELECT vm.nik, ANY_VALUE(vm.nama_matakuliah), ANY_VALUE(vdhi.nidn), ANY_VALUE(vdhi.nama), ANY_VALUE(vdhi.jenjang_pendidikan_tertinggi), ANY_VALUE(vdhi.status), ANY_VALUE(vdhi.jabatan_fungsional), ANY_VALUE(vdhi.kd_homebase), ANY_VALUE(vdhi.jenjang_homebase), ANY_VALUE(vdhi.unit_homebase) FROM vw_matakuliah vm join vw_dosen_hcm_insani vdhi on vdhi.nik = vm.nik where vm.nama_tahun_akademik = '2022/2023' and vdhi.status = 'Pegawai Tetap' and vm.kd_organisasi in (523, 917, 527) GROUP BY vm.nik;
自行编写的Eloquent代码
$rekap = DB::table('vw_matakuliah as vm') ->select(DB::query(' vm.nik, any_values(vhdi.nidn), any_values(vhdi.nama), any_values(vhdi.jenjang_pendidikan_tertinggi), any_values(vhdi.status), any_values(vhdi.jabatan_fungsional), any_values(vhdi.kd_homebase), any_values(vhdi.jenjang_homebase), any_values(vhdi.unit_homebase), any_values(vhdi.kd_homebase)') )->join('vw_dosen_hcm_insani as vhdi', 'vhdi.nik', 'vm.nik') ->where('vm.nama_tahun_akademik', $currentAcademicYears) ->whereIn('vm.kd_organisasi', $kdProdi) ->where('vhdi.status', 'Pegawai Tetap') ->groupBy('vm.nik')->get();
报错信息
ErrorException: stripos() expects parameter 1 to be string, object given in /var/www/html/vendor/illuminate/database/Query/Grammars/Grammar.php:1145
问题原因与解决方法
原因
你在select()方法里传入了DB::query()的返回值(一个QueryBuilder对象),但**select()要求传入字符串或数组形式的字段列表**,Laravel内部处理该对象时调用stripos函数,因参数类型不匹配触发报错。同时还存在两处细节错误:
- SQL函数名写错:原始SQL用的是
ANY_VALUE,你写成了any_values - 表别名不一致:原始SQL关联表别名是
vdhi,你写成了vhdi
正确写法
有两种可行的修复方式:
方式1:使用selectRaw()直接传入原生SQL片段
$rekap = DB::table('vw_matakuliah as vm') ->selectRaw(' vm.nik, ANY_VALUE(vm.nama_matakuliah), ANY_VALUE(vdhi.nidn), ANY_VALUE(vdhi.nama), ANY_VALUE(vdhi.jenjang_pendidikan_tertinggi), ANY_VALUE(vdhi.status), ANY_VALUE(vdhi.jabatan_fungsional), ANY_VALUE(vdhi.kd_homebase), ANY_VALUE(vdhi.jenjang_homebase), ANY_VALUE(vdhi.unit_homebase) ') ->join('vw_dosen_hcm_insani as vdhi', 'vdhi.nik', '=', 'vm.nik') ->where('vm.nama_tahun_akademik', $currentAcademicYears) ->whereIn('vm.kd_organisasi', $kdProdi) ->where('vdhi.status', 'Pegawai Tetap') ->groupBy('vm.nik') ->get();
方式2:逐个字段用select()结合DB::raw()
$rekap = DB::table('vw_matakuliah as vm') ->select( 'vm.nik', DB::raw('ANY_VALUE(vm.nama_matakuliah)'), DB::raw('ANY_VALUE(vdhi.nidn)'), DB::raw('ANY_VALUE(vdhi.nama)'), DB::raw('ANY_VALUE(vdhi.jenjang_pendidikan_tertinggi)'), DB::raw('ANY_VALUE(vdhi.status)'), DB::raw('ANY_VALUE(vdhi.jabatan_fungsional)'), DB::raw('ANY_VALUE(vdhi.kd_homebase)'), DB::raw('ANY_VALUE(vdhi.jenjang_homebase)'), DB::raw('ANY_VALUE(vdhi.unit_homebase)') ) ->join('vw_dosen_hcm_insani as vdhi', 'vdhi.nik', '=', 'vm.nik') ->where('vm.nama_tahun_akademik', $currentAcademicYears) ->whereIn('vm.kd_organisasi', $kdProdi) ->where('vdhi.status', 'Pegawai Tetap') ->groupBy('vm.nik') ->get();
额外注意点
- 保持SQL函数名和原始查询一致,避免大小写或拼写错误
- 表别名要全局统一,防止关联逻辑出错
join方法的关联条件建议显式添加=,避免Laravel解析歧义
内容的提问来源于stack exchange,提问作者Yustina Yasin
相关产品推荐
相关产品推荐

