こんにちは。Laravel初心者の大学生です。
現在Laravelで投稿の編集フォームを作っています。
編集フォームのテキストエリアにはDBに登録されているテキストが表示されるようにし、画像は新しい画像が選択された場合のみ更新できるようにしたいです。
自分でコードを組んでみたのですが、画像を選択していないと
SQLSTATE[HY000]: General error: 1364 Field 'image' doesn't have a default value (SQL: insert into
tests
(user_id
,name
,updated_at
,created_at
) values (1, あああ, 2020-07-19 06:59:31, 2020-07-19 06:59:31))
というエラーが表示され、また、画像を選択した場合は編集されるのではなく、DBに新しくデータが追加されてしまいます。
以下がコードになるのですが、どこで間違えてしまっているのかご教示願いたいです。
web.php
php
1Route::get('/tests/edit/{id}', 'TestController@edit'); //編集 2 Route::patch('/tests', 'TestController@update'); //更新
TestController.php
php
1use Illuminate\Support\Facades\Storage; 2 3public function edit(Request $request) 4 { 5 $test = Test::findOrFail($request->id); 6 return view('test.edit', ['test' => $test]); 7 } 8 9public function update(Request $request, Test $test) 10 { 11 $test->user_id = $request->user()->id; 12 $test->name = $request->name; 13 14 if($request->hasFile('image')) { 15 Storage::delete('public/image/' . $test->image); //元の画像を削除 16 $path = $request->file('image')->store('public/image'); //画像のパス 17 $test->image = basename($path); 18 $test->save(); 19 } 20 21 $test->save(); 22 23 return redirect('/tests')->with('flash_message', '編集が完了しました'); 24 }
edit.blade.php
php
1@extends('layouts.app') 2 3@section('content') 4<div> 5 <form action="/tests" method="post" enctype="multipart/form-data"> 6 {{ csrf_field() }} 7 {{ method_field('patch') }} 8 料理名:<input type="text" name="name" value='{{ $test->name }}'><br> 9 画像: <input type="file" name="image"><br> 10 <input type='submit' value='更新'> 11 </form> 12</div> 13@endsection
よろしくお願いいたします。