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

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

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

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

PHP

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

2回答

655閲覧

Laravelで複数formそれぞれに、入力個数を更新する機能を持たせたい。

hiropiro

総合スコア0

Laravel

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

PHP

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2021/01/12 12:04

前提・実現したいこと

・laravelにて、在庫管理を目的とするサービスを作成中
・表示するデータ表の各レコードごとにformタグを持たせ、それぞれに「個数を入力し、submitする」機能。
もとい、更新する機能を持たせたい。

現在の挙動の詳細としては、各々POST送信してもエラーは出ないが、データも更新されないという状態。

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

わざとバリデーションで引っかかるようにして試した結果、
・$request->id、 $request->numbers ともに、各formごとに送信されているみたい。(バリデはget送信みたいですけどね‥)

・タイポも見つけられない状態で、データが更新されないことに絶望している。

該当のソースコード

web

1Route::get('inventory_control', 'StockModelController@indexGet')->middleware('auth'); 2Route::post('inventory_control', 'StockModelController@indexPost');

StockModelController

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\User; 6use App\Models\Stock; 7use Illuminate\Http\Request; 8use Illuminate\Support\Facades\Auth; 9 10class StockModelController extends Controller 11{ 12 public function indexGet(Request $request) 13 { 14 $user = Auth::user(); 15 $userInfo = $user->withCount('stocks')->get(); 16 $sort = $request->sort; 17 if (isset($sort) == true) { 18 $stockData = Stock::where('user_id', $user->id) 19 ->orderBy($sort, 'asc') 20 ->paginate(20); 21 } else { 22 $stockData = Stock::where('user_id', $user->id) 23 ->paginate(20); 24 } 25 return view('homepage', compact('user', 'userInfo', 'sort', 'stockData')); 26 } 27 28 public function indexPost(Request $request) 29 { 30 $this->validate($request, Stock::$rules); 31 $stockFind = Stock::find($request->id); 32 $stockFind->numbers = $request->numbers; 33 $stockFind->save(); 34 return redirect('/inventory_control'); 35 } 36以下略、

Stock

1(※Stockモデルです。バリデーションが記述してあります。) 2 3<?php 4 5namespace App\Models; 6 7use Illuminate\Database\Eloquent\Factories\HasFactory; 8use Illuminate\Database\Eloquent\Model; 9 10class Stock extends Model 11{ 12 use HasFactory; 13 14 protected $guarded = array('id'); 15 16 public static $rules = array ( 17 'category' => 'max:50', 18 'goods' => 'required|max:50', 19 'numbers' => 'required|lte:9999', 20 'remarks' => 'max:1000', 21 ); 22 23}

homepageBladePhp

1@include('includes.head') 2 3<body> 4 <div class="container header"> <!-- header --> 5 6 7 <div class="siteTitle text-center"> 8 <h1 class="siteTitle mt-4 pb-1"><a href="/inventory_control" style="text-decoration: none;"> 9 <b class="text-success"><i class="fas fa-boxes mr-3"></i>在庫管理くん<i class="fas fa-boxes ml-3"></i></b> 10 </a></h1> 11 </div> 12 13 <hr class="w-75 pb-0 mb-0"> 14 15 <div class=""> 16 17 <div class="d-block userName text-center"> 18 @if (Auth::check()) 19 <p class="text-muted userInfo_M pt-2 pb-1"> <b><i class="fa fa-user h4" aria-hidden="true"></i> 『 {{$user -> name}} 』さん</b> </p> 20 @else 21 <p class="text-muted userInfo_M p-2"> <a href="/register"><b>ユーザー登録</b></a> </p> 22 @endif 23 </div> 24 25 <div class="text-center d-block my-2 pt-2"> 26 <a id="logout-link" class="logout-links" href="{{ route('logout') }}">{{ __('ログアウト') }}</a> / <a class="" href="/inventory_control/withdrawal">退会</a> 27 </div> 28 29 <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> 30 @csrf 31 </form> 32 33 </div> 34 35 <hr class="pt-0 mt-0"> 36 37 </div> <!-- /header --> 38 39 40 @foreach($userInfo as $info) 41 @if ( $info->id == $user->id ) 42 @php 43 $counter = $info->stocks_count; 44 @endphp 45 @break 46 @endif 47 @endforeach 48 49 50 <div class="dataCount ml-5"> 51 <p class="text-muted d-inline">登録データ数: 52 <div id="userInfoCount" class="text-muted d-inline"> 53 {{ $counter }} 54 </div> 55 </p> 56 </div> 57 58 59 <div class="container mainContents"> <!-- mainContents --> 60 61 <div class="text-center mt-4 mb-5"> 62 <a class="btn btn-lg btn-primary" href="/inventory_control/data_register" role="button">データ登録</a> 63 </div> 64 65 66 @error('numbers') 67 <div class="row flashingWarning mt-0 mb-5"> 68 <div class="col-1"></div> 69 <div class="col w-75"> 70 <p class="bg-warning text-danger text-center">個数を入力するか、9999以下の数にして下さいっ!</p> 71 </div> 72 <div class="col-1"></div> 73 </div> 74 @enderror 75 76 77 @foreach($userInfo as $info) 78 @if ( $info->id == $user->id ) 79 @php 80 $counter = $info->stocks_count; 81 @endphp 82 @break 83 @endif 84 @endforeach 85 86 @if($counter == 0) 87 <div class="text-center h4">登録データがありません。</div> 88 @else 89 <table class="noset-table table table-hover table-dark recordTable"> 90 <thead> 91 <tr class="text-center"> 92 <th><a href="/inventory_control?sort=category">カテゴリー</a></th> 93 <th><a href="/inventory_control?sort=goods">品 物</a></th> 94 <th><a href="/inventory_control?sort=numbers">個 数</a></th> 95 <th><a href="/inventory_control?sort=remarks">備 考</a></th> 96 </tr> 97 </thead> 98 <tbody> 99 @foreach ($stockData as $stock) 100 <tr class="recordData table-secondary text-dark"> 101 <td class="text-center align-middle"> 102 <div class="sendLink d-none">{{$stock->id}}</div> 103 {{Str::limit( $stock->category, 14 )}} 104 </td> 105 <td class="text-center align-middle"> 106 {{Str::limit( $stock->goods, 14 )}} 107 </td> 108 <td class="text-center w-25 align-middle"> 109 <form method="POST"> 110 @csrf 111 <input name="id" type="hidden" value="{{$stock->id}}"> 112 <input name="numbers" type="number" value="{{$stock->numbers}}" class="pl-3 my-1 text-center w-75"> 113 <input type="submit" value="送信" class="my-1"> 114 </form> 115 </td> 116 <td class="px-3 align-middle"> 117 <pre>{{Str::limit( $stock->remarks, 40 )}}</pre> 118 </td> 119 </tr> 120 @endforeach 121 </tbody> 122 </table> 123 @endif 124 125 126 <div class="paginate d-sm-none d-flex justify-content-center my-5 pagination-lg">{{ $stockData->appends(['sort' => $sort])->links('vendor.pagination.bootstrap-4') }}</div> <!-- Mobile_paginate--> 127 128 <div class="paginate d-none d-sm-flex justify-content-center my-5">{{ $stockData->appends(['sort' => $sort])->links('vendor.pagination.bootstrap-4') }}</div> <!-- NotMobile_paginate--> 129 130 131 </div> <!-- /mainContents --> 132 133@include('includes.footer')

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

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

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

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

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

guest

回答2

0

お力になれず申し訳ないです。
とりあえずdd($request)を入れてみてください。
これで本当にデータが送信されてきているかどうか判断できます。
データが送信されていれば、controller側の問題。
送信されていなければ、form側の問題です。

public function indexPost(Request $request) { dd($request) $this->validate($request, Stock::$rules); $stockFind = Stock::find($request->id); $stockFind->numbers = $request->numbers; $stockFind->save(); return redirect('/inventory_control'); }

投稿2021/01/13 00:54

kunugi

総合スコア16

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

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

0

<form method="POST">の中に、actionが抜けているのが原因ではありませんでしょうか。 この場合ですと、 webのrouteにnameをつけて、 > Route::post('inventory_control', 'StockModelController@indexPost')->name('indexPost');

blade.phpファイルのformにアクションで、routeのnameとidを渡してあげればいいかと思います。

<form method="POST" action="{{route('indexPost' , $stock->id )}}" enctype="multipart/form-data">

投稿2021/01/12 15:41

kunugi

総合スコア16

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

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

hiropiro

2021/01/12 23:59

回答ありがとうございますっ! formのactionは「指定しないと現在いるページにactionする」らしいので、書かないままでいました。 もう一度調べると、端末によってごく一部挙動が異なるものがあるようで、 actionは指定する方が無難という結論に至りました。 (というか、質問するなら混乱するからつけとけよって話ですよね、すいません。) さて、少し本題と脱線してしまいましたが、 kunugi様の回答のとおり実践した結果‥ダメでした。。。 とはいえ、入門書レベルの私からは発想できないアプローチやその記述方法、 大変勉強になりました。 teratailでの質問そのものも初めてでしたので、 心温かい回答を得られたこと、非常に感謝しております。 もう少しだけ、自分自身でも原因を探ってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問