无法使用 Laravel 中的 API 请求进行更新

Cannot update with an API request in Laravel

我尝试使用来自 Vue SPA 的 API 请求更新记录,但失败了 这是我申请的相关部分

相关的迁移table

public function up()
    {
        Schema::create('user_preferences', function         (Blueprint $table) {
            $table->id();
            $table->foreignIdFor(\App\Models\User::class,'user_id');
            $table->json('brands_fermentable');
            $table->timestamps();
        });
    }

型号

    class UserPreferences extends Model
{
        use HasFactory;
        protected $casts = [
            'brands_fermentable' => 'array'
        ];
        protected $fillable=[
        'user_id',
        'brands_fermentable'
        ];
}

资源

class UserPreferencesResource extends JsonResource
 {
/**
 * Transform the resource into an array.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
 */
public function toArray($request)
{
   return [
        'id' => $this->id,
        'user_id'=>$this->user_id,
        'brands_fermentable'=>$this->brands_fermentable,
        'created_at' => (new \DateTime($this->created_at))->format('Y-m-d H:i:s'),
        'updated_at' => (new \DateTime($this->updated_at))->format('Y-m-d H:i:s')
    ];
}

}

请求

class UpdateUserPreferencesRequest extends FormRequest
{
/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        "id"=>'required|integer',
        "user_id" => 'required|integer',
        "brands_fermentable"=>'required|array'
    ];
}

控制器方法

 public function update(UpdateUserPreferencesRequest $request, UserPreferences $userPreferences)
 {
    $userPreferences->update(
        $request->validated());
   
         return (new UserPreferencesResource($userPreferences));
 
   
}

public function store(StoreUserPreferencesRequest $request)
{
     $data = $request->validated();
    $data['user_id'] =  Auth::user()->id ;
    $result = UserPreferences::create( $data);
    return new UserPreferencesResource($result);
}

我提出的要求

First request is a post (It works)
POST

Request payload

{
"brands_fermentable": [
    1,
    3
],
"id": null,
"user_id": null
}

Request response 
{
"data": {
    "id": 53,
    "user_id": 1,
    "brands_fermentable": [
        1,
        3
    ],
    "created_at": "2022-04-22 10:40:25",
    "updated_at": "2022-04-22 10:40:25"
    }
}

第二个请求是 put(失败)

PUT

请求负载

  {
    "brands_fermentable": [
    1,
    3,
    2
    ],
   "id": 53,
   "user_id": 1
  }

请求响应

  {
    "data": {
    "id": null,
    "user_id": null,
    "brands_fermentable": null,
    "created_at": "2022-04-22 10:40:31",
    "updated_at": "2022-04-22 10:40:31"
    }
 }

我不明白哪里出了问题。我成功地与其他控制器做了类似的事情。这里唯一的区别是存储为 brands_fermentable 的数组。 我需要帮助。提前致谢

在第一条评论后编辑

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });


        Route::delete('/logout', [AuthController::class, 'logout']);
        Route::post('/fermentableBoth',[FermentableBothController::class,'store']);
        Route::put('/fermentableBoth/{fermentable}',[FermentableBothController::class,'update']);
        Route::resource('inventoryFermentable', InventoryFermentableController::class);
        Route::resource('fermentable', FermentableController::class);
        Route::resource('fermentableBrand', FermentableBrandController::class);
        Route::resource('userPreferences',UserPreferencesController::class);
    });

根据您的路由资源和 update() 方法签名,您需要在路由模型绑定中使用单数变量名称(注意删除变量中的 s

Laravel的路由模型绑定需要准确的变量名作为路由定义,是单数。

public function update(UpdateUserPreferencesRequest $request, UserPreferences $userPreference)

作为建议,将您的模型命名为单数也是一种很好的做法(即:UserPreference)。一个模型是 1 项。