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

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

ただいまの
回答率

89.55%

Laravel 画像の値について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 134

kuro2019

score 3

前提・実現したいこと

編集フォームから更新をする際に、画像データを入力せずにpost出来るようにしたいです。
条件
※入力を必須にはしない。  'image' => 'required',は使用しない
※データベースの設定を替えたくない。 画像の設定は、NULL:いいえ、デフォルト値:なしになっています。

 環境

PHP7.2.3
Laravel 5.4

 発生している問題・エラーメッセージ

エラー文:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'image' cannot be null (SQL: update articles set area = west, image = ,updated_at = 2019-12-05 17:22:44 where id = 17)

 該当のソースコード

入力フォーム edit.blade.php

        <div class="image @if(!empty($errors->first('image'))) has->error @endif">
<input type="file" name="image" enctype="multipart/form-data" value="{{$info['image']}}">
<span class="help-block">{{$errors->first('image')}}</span>
</div>

確認画面(一覧になる仕様です。) edit_confirm.blade.php

 <td>画像</td>
<td>{{$info['image']}}</td>
中略
      <input type="hidden" name="image" enctype="multipart/form-data" value="{{ $info['image'] }}">

 試したこと

検索をしてinputタグに、
enctype="multipart/form-data"
を入力しましたがエラーが消えなかったです。
エラー回避できる方法あれば教えていただきたいです。

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

追記

コントローラー
   //  編集画面 遷移
    public function sendData($id){
        $info = Article::find($id);
        return view('article/edit',['info'=>$info]);
    }

    // 編集 確認画面
    public function confirmEdit(ArticleRequest $request)
    {
        $info = $request->all();
        return view('article/edit_confirm',compact('info'));
    }

    // 更新画面

    public function edit(ArticleRequest $request)
    {
        $id =$request->id;
        $data = Article::find($id);
                                                        // 取得したデータに上書きする
        $data->name = $request->name; 
        $data->email = $request->email;
        $data->age = $request->age;
        $data->area = $request->area;
        $data->gender = $request->gender;
        $data->media1 = $request->media1;
        $data->media2 = $request->media2;
        $data->note = $request->note;
        $data->image = $request->image;
        $data->save();

        return view('/article/edit_complete',compact('data'));
    }

 

view 入力フォーム 
@extends('layout/layout')

@section('content')

@if($errors->any())
    <div class="errors">
        <ul>
            @foreach($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif


<div class="row">
    <form method="post" action="{{ url('/article/insert_confirm')}}">
        {{ csrf_field() }}
            <br>
            <br>
        <h1>新規登録</h1>
            <br>
            <div class="form-group @if(!empty($errors->first('name'))) has-error @endif">
                <label>名前</label>
                <input type="text" name="name" class="form-control">
                <span class="help-block">{{$errors->first('name')}}</span>
            </div>

            <div class="form-group @if(!empty($errors->first('email'))) has-error @endif">
                <label>E-Mail</label>
                <input type="mail" name="email" class="form-control">
                <span class="help-block">{{$errors->first('email')}}</span>
            </div>

            <div class="form-group @if(!empty($errors->first('age'))) has-error @endif">
                <label>年齢</label>
                <input type="number" name="age" class="form-control">
                <span class="help-block">{{$errors->first('age')}}</span>
            </div> 

            <div class="form-group @if(!empty($errors->first('area'))) has-error @endif">
                <label>エリア</label>
                <select name="area" class="form-control">
                    <option value="east" selected>東日本</option>
                    <option value="west">西日本</option>
                </select>
                <span class="help-block">{{$errors->first('area')}}</span>
            </div>

                <p><b>性別</b></p>
            <div class="radio-inline @if(!empty($errors->first('gender'))) has-error @endif">
                <label>
                    <input type="radio" name="gender" value="1" checked>男性
                </label>
                <span class="help-block">{{$errors->first('gender')}}</span>
            </div>

            <div class="radio-inline">
                <label>
                    <input type="radio" name="gender" value="2" @if(Request::old('gender')=="2") ckecked @endif>女性
                </label>
                <span class="help-block">{{$errors->first('gender')}}</span>
            </div>

            <p><b>告知メディア</b></p>
        <div class="form-check  @if(!empty($errors->first('media1'))) has->error @endif">
            <label>
                <input type="hidden" name="media1" value="">
                <input type="checkbox" name="media1" value="web" @if(Request::old('media1')=="web") checked @endif>web
            </label>
            <span class="help-block">{{$errors->first('media1')}}</span>
        </div>
        <div class="form-check @if(!empty($errors->first('media2'))) has->error @endif">
            <label>
                <input type="hidden" name="media2" value="">
                <input type="checkbox" name="media2" value="tv" @if(Request::old('media2')=="tv") checked @endif>tv
            </label>
            <span class="help-block">{{$errors->first('media2')}}</span>
        </div>

        <div class="textarea @if(!empty($errors->first('note'))) has->error @endif">
            <!-- <label for="textarea1">ご意見</label> -->
            <textarea id="textarea1" class="form-control" name="note" placeholder="ご自由に入力ください。">{{Request::old('note')}}</textarea>
            <span class="help-block">{{$errors->first('note')}}</span>
        </div>

        <div class="image @if(!empty($errors->first('image'))) has->error @endif">
            <input type="file" name="image">
            <span class="help-block">{{$errors->first('image')}}</span>
        </div>

            <br><br>
            <input type="submit" value="確認画面へ" class="btn btn-success">
    </form>

            <br>
    <form method="post" action="{{ url('/article/list')}}">
        {{ csrf_field() }}
            <input type="submit" value="リスト一覧に戻る" class="btn btn-primary">
    </form>
@stop
@extends('layout/layout')

@section('content')

@if (session('media'))
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="alert alert-warning">
                {{ session('media') }}
            </div>
        </div>
    </div>
    @endif
@yield('content')

<h1>編集内容確認</h1>

        <table class="table table-striped">
            <tr>
                <td>名前</td>
                <td>{{$info['name']}}</td>
            </tr>
            <tr>
                <td>E-Mail</td>
                <td>{{$info['email']}}</td>
            </tr>
            <tr>
                <td>年齢</td>
                <td>{{$info['age']}}</td>
            </tr>
            <tr>
                <td>エリア</td>
                <td>{{$info['area']}}</td>
            </tr>
            <tr>
                <td>性別</td>
                <td>{{$info['gender']}}</td>
            </tr>
            <tr>
                <td>メディア1</td>
                <td>{{$info['media1']}}</td>
            </tr>
            <tr>
                <td>メディア2</td>
                <td>{{$info['media2']}}</td>
            </tr>
            <tr>
                <td>ご意見</td>
                <td>{{$info['note']}}</td>
            </tr>
            <tr>
                <td>画像</td>
                <td>{{$info['image']}}</td>
            </tr>
            </td>
            </tr>
        </table>

        <form action="/article/edit_complete" method="post">
            {{ csrf_field() }}
                <!--hidden -->
                <input type="hidden" name="id" value="{{ $info['id'] }}">
                <input type="hidden" name="name" value="{{ $info['name'] }}">
                <input type="hidden" name="email" value="{{ $info['email'] }}">
                <input type="hidden" name="age" value="{{ $info['age'] }}">
                <input type="hidden" name="area" value="{{ $info['area'] }}">
                <input type="hidden" name="gender" value="{{ $info['gender'] }}">
                <input type="hidden" name="media1" value="{{ $info['media1'] }}">
                <input type="hidden" name="media2" value="{{ $info['media2'] }}">
                <input type="hidden" name="note" value="{{ $info['note'] }}">
                <input type="hidden" name="image" enctype="multipart/form-data" value="{{ $info['image'] }}">

            <input type="submit" value="編集実行" class="btn btn-primary">
            <br><br>
            <a href="/article/list" class="btn btn-success" style="maerin:20px">フォームに戻る</a>
        </form>
@stop


dd($data)の結果

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/12/05 18:07

    コントローラ側のコードとimageのPOST結果をdd()で出力してみて結果を追記してください

    キャンセル

  • m.ts10806

    2019/12/05 18:07

    あとformタグ含めてビュー全体もですね

    キャンセル

  • kuro2019

    2019/12/05 18:28

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

    キャンセル

回答 1

checkベストアンサー

+1

enctype はformタグにつけるものです。
また、hiddenにもてるのは文字情報です。

つまり現状の実装では新規登録→内容確認 の時点で渡せていませんし、確認画面から完了画面へ画像は渡っていません。
確認画面をブラウザ「ソースを表示」で確認してみてください。

これを解消するには新規登録画面でformタグにenctypeを付帯するのが第一。
確認画面へPOSTした時点で一度仮でアップロード処理を行いセッションなどにパスを保持。
確認画面から完了画面にPOSTしたときに正規のフォルダに移動

のような作りにすると良いです。
確認画面にはenctypeは不要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/05 23:13

    ご回答ありがとうございました。
    勉強不足でした。
    また、よろしくお願いいたします。

    キャンセル

  • 2019/12/05 23:34

    どのように解決されたのでしょうか?
    https://teratail.com/help/question-tips#questionTips4-2

    キャンセル

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

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる