簡體   English   中英

laravel中的更新方法將在數據庫中創建一個新模型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM