无法使用 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 项。
我尝试使用来自 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 项。