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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:50:31