laravel 中的更新方法将在数据库中创建一个新模型

我在 laravel restful api 构建中遇到问题,

和 route/api.php 如下:


Route::resource('kittrans','Kittrans\KittransController',['except'=>['index']]);

当我请求更新数据库中的对象时,问题是一个新模型将使用 $kittrans->save() 方法插入到表中!!


为什么会出现这个问题?


我从邮递员那里得到的请求是这样的:


网址:myApp.test/kittrans/5003


方法:放置,补丁


内容类型:application/x-www-form-urlencoded


数据:item_id,kmo_id,count


dd($kittrans);我还在save() 方法之前添加 了以下内容:


Kittrans {#345

#fillable: array:4 [

0 => "count"

1 => "kmo_id"

2 => "item_id"

3 => "user_id"

]

#connection: null

#table: null

#primaryKey: "id"

#keyType: "int"

+incrementing: true

#with: []

#withCount: []

#perPage: 15

+exists: false

+wasRecentlyCreated: false

#attributes: array:3 [

"item_id" => "1"

"kmo_id" => "1"

"count" => "7"

]

#original: []

#changes: []

#casts: []

#dates: []

#dateFormat: null

#appends: []

#dispatchesEvents: []

#observables: []

#relations: []

#touches: []

+timestamps: true

#hidden: []

#visible: []

#guarded: array:1 [

0 => "*"

]

}

为什么保存方法要在数据库中创建一个新的模型实例?我在所有其他控制器中实现了更新方法,一切正常,但是对于这个控制器,我不明白问题出在哪里?


湖上湖
浏览 121回答 2
2回答

LEATH

模型绑定的控制器方法的参数未正确命名。您的路线参数kittran不是kittrans;资源路由将使用资源的单数名称作为路由参数。您必须为绑定匹配该名称:public function update(Request $request, Kittrans $kittran)如果没有该匹配,您只会注入一个新的模型实例,而不是发生模型绑定。您可以运行route:list命令来查看您的路线是如何定义的:php artisan route:list“Laravel 会自动解析路由或控制器操作中定义的 Eloquent 模型,其类型提示的变量名称与路由段名称匹配。” - Laravel 6.x 文档 - 路由 - 路由模型绑定 - 隐式绑定“默认情况下,Route::resource将根据资源名称的“单一化”版本为您的资源路由创建路由参数。” - Laravel 6.x 文档 - 控制器 - 资源控制器 - 命名资源路由参数如果您想为此资源覆盖此行为,并将kittrans其用作参数名称,您也可以这样做,那么您无需更改控制器方法的签名:Route::resource('kittrans', 'Kittrans\KittransController', [    'except'=> ['index'],    'parameters' => ['kittrans' => 'kittrans'],]);

白板的微信

我相信您的模型绑定不正确,当您的模型绑定错误时,Kittrans 对象将为空并且不会保存到数据库中,当您填充并保存时它将保存一个新对象。要解决错误的模型绑定,请将其添加到RouteServiceProvider.php.use App\Kittrans;public function boot(){    parent::boot();    Route::model('kittrans', Kittrans::class);}
打开App,查看更多内容
随时随地看视频慕课网APP