[英]Update method in laravel are going to create a new model in database
我在Laravel RESTful API構建中遇到問題,
我有以下控制器
<?php
namespace App\Http\Controllers\Kittrans;
use App\Http\Controllers\Controller;
use App\Inventory;
use App\Kittrans;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class KittransController extends Controller
{
public function index()
{
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$rules =[
'kmo_id' => 'required',
'item_id' => 'required|integer|min:1',
'store_id' => 'required|integer|min:1',
'count' => 'required|integer|min:1'
];
$this->validate($request,$rules);
// check if requested count of item less than or equal to count in store
$inventory = DB::table('inventories')->where(
[
['item_id','=',$request->input('item_id')],
['store_id','=',$request->input('store_id')]
]
)->get();
if($inventory->count()!=1)
{
return response()->json(['Error'=>'Model not found'],404);
}
$remaining = $inventory->get(0)->count;
if($request->input('count') > $remaining)
{
return response()->json(['Error'=>'Request item count should be less than in the selected store!'],422);
}
// get user id bu auth. but for now i will make it static to complete first version of api
testing
$request['user_id'] = 1;
$newModel = Kittrans::create($request->all());
$remaining = $remaining - $request->input('count');
Inventory::where('id',$inventory->get(0)->id)->update(array('count' => $remaining));
return response()->json($newModel,200);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show(Kittrans $kittrans)
{
//
return response()->json($kittrans,200);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Kittrans $kittrans)
{
$kittrans->fill($request->only([
'item_id',
'kmo_id',
'count'
]));
if($kittrans->isClean())
{
return response()->json(['Error'=>'You should make some changes in your values to update'],422);
}
$kittrans->save();
return response()->json($kittrans,200);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Kittrans $kittrans)
{
//
$kittrans->delete();
return response()->json($kittrans,200);
}
}
和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,計數
我也添加了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 => "*"
]
}
為什么save方法將在db中創建模型的新實例? 我在所有其他控制器中都實現了更新方法,一切正常,但是對於此控制器,我不知道問題出在哪里?
模型綁定的控制器方法的參數名稱不正確。
您的路由參數是kittran
而不是kittrans
; 資源路由將使用資源的唯一名稱作為route參數。 您必須為綁定匹配該名稱:
public function update(Request $request, Kittrans $kittran)
沒有這種匹配,您只會獲得注入的新模型實例,而不是發生模型綁定。
您可以運行route:list
命令查看如何定義路由:
php artisan route:list
“ Laravel會自動解析在路由或控制器操作中定義的口才模型,其類型提示的變量名稱與路由段名稱匹配。” -Laravel 6.x文檔-路由-路由模型綁定-隱式綁定
“默認情況下,
Route::resource
將基於資源名稱的“單數”版本為您的資源路由創建路由參數。” -Laravel 6.x文檔-控制器-資源控制器-命名資源路由參數
如果要對此資源覆蓋此行為,並使用kittrans
作為參數名稱,也可以執行此操作,則無需更改控制器方法的簽名:
Route::resource('kittrans', 'Kittrans\KittransController', [
'except'=> ['index'],
'parameters' => ['kittrans' => 'kittrans'],
]);
我相信您的模型綁定不正確,當您的模型綁定錯誤時,Kittrans對象將為空並且不會保存到db,當您填充並保存它時將保存一個新對象。 要解決錯誤的模型綁定,請將其添加到RouteServiceProvider.php
。
use App\Kittrans;
public function boot()
{
parent::boot();
Route::model('kittrans', Kittrans::class);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.