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

Laravel路由使用withTrashed时模型resolveRouteBinding未触发问题咨询

结论

这是Laravel框架的已知行为,并非代码实现错误。
当路由声明中使用->withTrashed()方法时,Laravel的隐式绑定逻辑会优先执行自带的软删除查询逻辑,直接绕过模型自定义的resolveRouteBinding方法,因此你写在该方法内的代码不会被触发。

解决方案

方案1:将软删除逻辑迁移到resolveRouteBinding内实现

移除路由上的->withTrashed()调用,在模型的resolveRouteBinding方法中自行添加软删除查询规则,既能保留自定义绑定逻辑,也能实现查询已软删除数据的需求。
代码示例:

// routes/web.php 移除withTrashed调用
Route::get('user/{user}', function(SoftDeletedModel $user) {
    dd($user);
});
// Models/SoftDeletedModel.php
public function resolveRouteBinding($value, $field = null) {
    dd("Successfully Substituted Bindings when using WithTrashed.");
    // 手动添加withTrashed逻辑
    return $this->withTrashed()
        ->where($field ?? $this->getRouteKeyName(), $value)
        ->firstOrFail();
}

方案2:在路由服务提供者中自定义绑定规则

如果你需要保留路由上的withTrashed()调用,可以直接在app/Providers/RouteServiceProvider.php的boot方法中定义该参数的绑定逻辑,替代模型内的resolveRouteBinding方法:

public function boot()
{
    parent::boot();

    Route::bind('user', function ($value) {
        // 此处可添加任意自定义逻辑
        return SoftDeletedModel::withTrashed()->where('id', $value)->firstOrFail();
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:06:03