現在Laravelで掲示板アプリを作成しているのですが、投稿一覧内で投稿、編集、削除が完結するようにしてます。
現状、テキストと画像の両方に値が入ってないと登録できない状況です。
やりたいこととしては、テキストだけ投稿でき、任意で画像を投稿できるようにしたいです。
※補足ですが、「テキストだけ」投稿しようとすると、以下の画面でエラーになります。おそらく、storeメソッドを呼んでるのに、
//s3アップロード開始 $image = $request->file('image'); // バケットの`test`フォルダへアップロード $path = Storage::disk('s3')->putFile('test', $image, 'public'); // アップロードした画像のフルパスを取得 $post->image_path = Storage::disk('s3')->url($path);
上記の部分に何も入っていないためエラーになったと推測します。
もし、image_pathがnullだったら、そのままテキストだけ投稿できる。
もし、image_pathがnullではなかったら、テキストと画像の両方投稿できる。
この条件を、コントローラーで制御しようと思ったのですが、なかなか上手くいかず...
テーブル定義では、image_pathは基本はnullの状態です。s3に画像をアップロードする機能をつけてます。
ご教示のほど、よろしくお願いいたします。
関係するテーブル定義はこちらになります。
posts | CREATE TABLE `posts` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int NOT NULL, `text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `image_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) )
該当のコードがこちらになります。
index
1 2{{-- 投稿フォーム表示 --}} 3 <form action="/" method="post" enctype="multipart/form-data"> 4 {{ csrf_field() }} 5 <div class="text"> 6 <div> 7 <textarea name="text" rows="8" cols="80" placeholder="今何したい?"></textarea> 8 <label for="myImage"><i class="fas fa-image fa-2x"></i></label> 9 <input type="file" name="image" value="" id="myImage" accept="image/*" style="display:none"> 10 <img id="preview"> 11 12 {{ csrf_field() }} 13 </div> 14 </div> 15 {{-- 投稿ボタン表示 --}} 16 <div class="button"> 17 <button type="submit" class="index-button"> 投稿する</button> 18 </div> 19 </form>
PostsController
1public function store(Request $request) 2 { 3 $request->validate([ 4 'text' => 'required', 5 ]); 6 7 // モデルからインスタンスを生成 8 $post = new Post; 9 // postsテーブルのtextに、フォームから送られたtextを保存する 10 $post->text = $request->text; 11 // userテーブルのidを、postsテーブルのuser_idとして保存する 12 $post->user_id = $request->user()->id; 13 //s3アップロード開始 14 $image = $request->file('image'); 15 // バケットの`test`フォルダへアップロード 16 $path = Storage::disk('s3')->putFile('test', $image, 'public'); 17 // アップロードした画像のフルパスを取得 18 $post->image_path = Storage::disk('s3')->url($path); 19 // 保存 20 $post->save(); 21 // 保存後 一覧ページへリダイレクト 22 return redirect('/'); 23 24 } 25
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/10 09:53
退会済みユーザー
2020/04/10 11:33 編集
2020/04/10 12:38