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

Laravel+JS使用sum()计算酒店总价失败,报'in'运算符错误求助

问题根源与解决方案

这个错误的核心原因很明确:后端返回的是单个数值,但前端代码错误地将其当作数组来处理。

为什么会报错?

当你在Laravel中使用sum('hotel_total_price')时,查询返回的是一个纯数字(比如1500),而不是集合或数组。但你的前端代码里执行了JSON.parse(response)后,试图访问hotels.length——数字类型根本没有length属性,这就触发了Cannot use 'in' operator to search for 'length' in [数值]的错误。


修复方案(两种思路,任选其一即可)

思路1:调整后端返回格式(推荐)

把单个数值包装成对象或数组返回,让前端能按预期处理。同时改用Laravel内置的response()->json()方法,它会自动设置正确的Content-Type响应头,避免前端手动解析JSON的麻烦:

public function getHotelName(Request $req) { 
    $hotel_code = $req->hotel_id; 
    $totalPrice = DB::table('book_hotel')->where('id_hotel', $hotel_code)->sum('hotel_total_price'); 
    // 包装成对象返回,语义更清晰
    return response()->json(['total_price' => $totalPrice]); 
}

对应的前端代码可以简化为:

const getInfoHotel = function(hotelCode) { 
    $.get(API.get.hotelname, {hotel_id: hotelCode}).done(function(response){ 
        // 直接使用解析好的对象属性,无需JSON.parse
        $('#modalTotalPriceHotel #total_price_hotel').val(response.total_price); 
    }); 
}

思路2:直接修改前端处理逻辑

如果不想改动后端,前端可以直接处理单个数值,不需要判断length或循环:

const getInfoHotel = function(hotelCode) { 
    $.get(API.get.hotelname, {hotel_id: hotelCode}).done(function(response){ 
        const totalPrice = JSON.parse(response); 
        // 直接赋值,因为返回的就是单个价格数值
        $('#modalTotalPriceHotel #total_price_hotel').val(totalPrice); 
    }); 
}

额外优化建议

  • 后端尽量使用response()->json()替代echo json_encode(),它能自动处理编码和响应头,减少潜在问题。
  • 前端可以增加错误处理逻辑,比如请求失败时提示用户:
const getInfoHotel = function(hotelCode) { 
    $.get(API.get.hotelname, {hotel_id: hotelCode})
        .done(function(response){ 
            $('#modalTotalPriceHotel #total_price_hotel').val(response.total_price); 
        })
        .fail(function(){
            alert('获取酒店总价失败,请稍后重试');
        }); 
}

内容的提问来源于stack exchange,提问作者Nguyễn Minh Trí

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:58