質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

790閲覧

Lravel6 投稿の編集を行うと、新規投稿として保存されてしまう。

tkm0604

総合スコア554

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/12/06 08:13

環境:Lravel6 /PostgreSQL
resourceコントローラーを作成し、新規投稿の作成、投稿の削除機能は実装できました。
しかし、投稿の編集を行い保存をすると、投稿の上書きではなく、新規投稿として保存されてしまいます。

ルート(web.php)の設定は以下のようにしています。

PHP

1Route::resource('/post', 'PostController');

editメソッド、updateメソッドを記述している、コントローラー(PostController.php)のコード

PHP

1 2 public function edit(Post $post) 3 { 4 return view('post.edit',compact('post')); 5 } 6 7 public function update(Request $request, Post $post) 8 { 9 $inputs=$request->validate([ 10 'title'=>'required|max:255', 11 'image'=>'required|max:1024' 12 ]); 13 14 $post=new Post(); 15 //name属性titleで送られてきた情報をバリデーションルールを通過させてpostsテーブルのtitleに代入 16 $post->title=$inputs['title']; 17 18 //ログインしているユーザーのIDをuser_idに代入 19 $post->user_id=auth()->user()->id; 20 21 //name属性imageで送られて来たファイル名前を取得し、$originalに代入 22 $original=request()->file('image')->getClientOriginalName(); 23 $name=date('Ymd_His').'_'.$original; 24 $file=request()->file('image')->move('storage/images',$name); 25 $post->image=$name; 26 27 //上記の状態で$postを保存 28 $post->save(); 29 //処理が終わると'message'を表示してreturn back 30 return back()->with('message','画像を更新しました'); 31 } 32

投稿の編集画面(edit.blade.php)のコード

PHP

1{{-- edit.blade.php --}} 2@extends('layouts.app') 3@section('content') 4 <div class="container"> 5 <div class="row justify-content-center text-center"> 6 @if($errors->any()) 7 <div class="alert alert-danger"> 8 <ul> 9 @foreach($erros->all() as $error) 10 <li>{{$error}}</li> 11 @endforeach 12 </ul> 13 </div> 14 @endif 15 <div class="col-md-8"> 16 @if (session('message')) 17 <div class="alert alert-success">{{ session('message') }}</div> 18 @endif 19 <h1 class="mt4">投稿の編集</h1> 20 <form method="post" action="{{route('post.update', $post)}}" enctype="multipart/form-data"> 21 @csrf 22 @method('put') 23 <div class="form-group"> 24 <div> 25 @if($post->image) 26 <img src="{{ asset('storage/images/'.$post->image)}}" 27 class="img-fluid rmx-auto d-block"> 28 @endif 29 </div> 30 <label for="image">画像(1MBまで)</label> 31 <div class="col-md-6"> 32 <input id="image" type="file" name="image"> 33 </div> 34 </div> 35 <input type="text" name="title" class="form-control" id="title" value="{{old('title',$post->title)}}" placeholder="Enter Title"> 36 <button type="submit" type="file" class="btn btn-succsess">保存する</button> 37 </form> 38 <a href="{{ route('home')}}">投稿一覧へ移動</a> 39 </div> 40 </div> 41 </div> 42@endsection 43

上記コードで、edit.blade.php の「保存する」ボタンをおすと、新規投稿として、データベースに保存されます。

edit.blade.php、<form>タグの下で @method('put')とHTTPメソッドのPUT/PATCHを指定し、リソースコントローラーのupdateメソッドに保存する内容を記述しています。

しかし、なぜ投稿の更新。ではなく、新規投稿として、データベースに保存されてしまうのでしょうか?
HTTPメソッドを @method('patch')に書き換えても症状は変わりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skys215

2021/12/06 15:42

action="{{route('post.update', $post->id)}}" で試してください。
tkm0604

2021/12/07 01:22

コメントありがとうございます。 formタグでaction="{{route('post.update', $post->id)}}" としましたが、結果は変わらず、新規投稿となりました。 以前作成した教材とアプリと同じようにコードを書いていて、教材の時は同じコードで、記事の編集、更新できたのですが、なんで今回は編集、更新ができないのか。。。 教材の時と違うのは、データベース(教材はMySQL、今回はPostgreSQL)、postsテーブルのカラムの数。 くらいしか変わりないです。 その辺も関係してきたりするのでしょうか?
tkm0604

2021/12/07 01:59

コメントありがとうございました。 解決方法にも書きましたように、updateメソッドに $post=new Post();と新しくインスタンスを作成していたのが原因でした。 時間かかりましたが、勉強になりました。
guest

回答1

0

自己解決

PostController.phpのupdateメソッドに $post=new Post(); と、新しくインスタンスを作成していたのが原因でした。

updateは更新なので、新しくインスタンスを作成する必要はありませんでした。

投稿2021/12/07 01:56

編集2021/12/07 01:57
tkm0604

総合スコア554

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問