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

Laravel中PATCH请求的if判断始终为true问题求助

问题原因与解决办法

核心问题

1. 路由参数格式错误

Laravel路由的参数分隔符应该是/,而非你用的&——&是URL查询参数的分隔符,用在路由参数里会导致后端解析异常,布尔值参数会被强制转为字符串。

2. PHP字符串的布尔判断逻辑

当你把false作为路由参数传递时,URL里会变成字符串"false"。在PHP中,所有非空字符串都会被判定为true,所以不管你传true还是false,if($favourite)的判断结果永远为真。


修复方案(推荐第一种)

方案一:用请求体传递布尔参数(符合REST规范)

修改Vue请求代码

把favourite参数放在请求体里,而非路由参数:

toggleFav(id, content) {
    this.isFavorite = !this.isFavorite;
    const currentCookies = VueCookies.get("FavId") ? VueCookies.get("FavId").split(',') : [];
    let arrayCookies = [];

    if (this.isFavorite) {
        arrayCookies = [...currentCookies, id];
        VueCookies.set("FavId", arrayCookies.join(','));
        this.$inertia.patch(
            this.route("addfavDB", [content, id]),
            { favourite: true } // 参数放请求体
        );
    } else {
        arrayCookies = currentCookies.filter(item => item != id);
        VueCookies.set("FavId", arrayCookies.join(','));
        this.$inertia.patch(
            this.route("addfavDB", [content, id]),
            { favourite: false } // 参数放请求体
        );
    }
},

修改Laravel路由

移除路由中的favourite参数:

Route::patch('docs/plants/{content}/{id}', [PlantCharacteristicController::class, "addFav"])->name('addfavDB');

修改控制器方法

用boolean()方法解析请求体中的布尔值:

public function addFav(){
    $id = request('id');
    $content = request('content');
    // 正确解析布尔值,避免字符串判断误差
    $favourite = request()->boolean('favourite');

    if($favourite){
        dd('added to db');
    }else{
        dd('removed from db');
    }
}

方案二:修正路由参数格式(不推荐,仅作备选)

如果一定要通过路由参数传递布尔值,需要手动转义并解析:

修改路由

用/分隔所有参数:

Route::patch('docs/plants/{content}/{id}/{favourite}', [PlantCharacteristicController::class, "addFav"])->name('addfavDB');

修改Vue请求

将布尔值转为字符串'true'/'false'传递:

// 收藏分支
this.$inertia.patch(this.route("addfavDB", [content, id, 'true']));
// 取消收藏分支
this.$inertia.patch(this.route("addfavDB", [content, id, 'false']));

修改控制器方法

将字符串参数转为布尔值:

public function addFav($content, $id, $favourite){
    // 把字符串转为布尔值
    $favourite = filter_var($favourite, FILTER_VALIDATE_BOOLEAN);

    if($favourite){
        dd('added to db');
    }else{
        dd('removed from db');
    }
}

额外优化:Cookie数组处理

你原代码中currentCookies的处理会生成二维数组,建议改成一维数组的增删逻辑(已包含在方案一的Vue代码中),避免Cookie值格式混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:54:50