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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

1回答

1596閲覧

Laravelで画像とテキストをフォームから更新できない。

toyop

総合スコア30

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2020/07/19 07:11

こんにちは。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

よろしくお願いいたします。

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

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

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

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

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

SanQ

2020/07/19 07:48

DBの対象テーブルの「image」カラムの設定はどうなっていますか?nullableですか?
toyop

2020/07/19 08:07

コメントありがとうございます。 投稿する時点で画像は必須にしてあるので、nullableにはなっていないです。
guest

回答1

0

このコードはここに問題があると思います。
このコードはDBに既に存在するレコードを上書きするのではなく、新たにレコードを作成するコードになっていること。

すでに存在するDBのレコードの値を上書きする際は、Modelクラスにあるsave()を使用するのではなく、update()を使用します。
update()についてはこちら
Laravel Database: Query Builder
日本語版
データベース:利用開始 7.x Laravel - ReaDouble

あと、SQLSTATE[HY000]: General error: 1364 Field 'image' doesn't have a default valueの言わんとすることは、現在存在しているテーブルのレコードのimageカラムは値が入ってなくてはいけないのに、何も入れてくれていないという規約違反をしているからエラーだよ、ということです。
今回の例で言うと、save()を使って新たにレコードを作成するのにも関わらずimageが空だからエラーを出しています。このエラーは上記の問題を解決させ、もし写真の変更がなければそのレコードのimageは何もしない、というコードを書けば表示されなくなると思います。

投稿2020/07/19 08:49

編集2020/07/19 10:36
SanQ

総合スコア92

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

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

toyop

2020/07/19 09:49

ご回答ありがとうございます。 ご指摘いただいたtest->save()の2か所をtest->update()に変えました。 エラーは出なくなったのですが、データベースを確認してもなぜかデータが更新されません...。 これの原因もわかりますでしょうか。よろしくお願いいたします。
SanQ

2020/07/23 15:19 編集

update()で紹介した記事は読まれましたでしょうか? おそらくその記事ではtest->update()のような使い方はしていないと思います
SanQ

2020/07/19 10:39

ちなみに''DB::table''のDBは''use Illuminate\Support\Facades\DB;''を入れることで使用できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問