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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

410閲覧

【Laravel】バリデーションの定義方法がわかりません

hiroaki510

総合スコア16

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/07/02 00:48

編集2018/07/02 04:16

前提・実現したいこと

株のポートフォリオを管理できるwebアプリを作っているのですが、ユーザー入力にいくつかバリデーションを実装したいです。

OS mac10.13
PHP7.1.14
laravel 5.6

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

投資元本や証券コードを入力してもらうようにするのですが、投資元本がいくつもあるのはおかしいので、一つレコードがDBに記録されたら投資元本の値を再度入力出来ないようにしたいです。(現金(CP)にも同様の処理をおこないたいです)
↓に間違っている状況のスクショを載せます

該当のソースコード

現状、コントローラーにバリデーションを組んでいます。(app\Http\Controllers)

public function addPrincipal(Request $request){ //バリデーションの設定。filled(項目が空でないか)などの検証ルールは設定できました。     $validator = Validator::make($request->all(),[ 'principal' => 'filled|min:1|integer' ]); //下記コードでは複数入力出来てしまいました //$validator = Validator::make($request->all(),[ //'principal' => 'filled|min:1|integer', //'user' => 'unique:assets,user_id' //]); if($validator->fails()){ return redirect('/make') ->withErrors($validator) ->withInput(); } //ユーザーが入力した投資元本(principal)をDBに記録 $asset = new Asset; $asset->user_id = $request->user()->id; $asset->principal = $request->principal; $asset->save(); return redirect('/make'); }

投資元本の入力箇所(resources\views)

<form method="POST" action="/make/principal"> {{ csrf_field() }} @if($errors->has('principal')) <tr><th>ERROR</th><td>{{$errors->first('principal')}}</td></tr> @endif <tr><th>投資元本: </th><td><input type="text" name="principal" value="{{old('principal')}}"></td></tr> <tr><th></th><td><button type="submit">設定</button></td></tr> </form>

投資元本を管理しているテーブル(assets)

id user_id principal created_at updated_at ---------- ---------- ---------- ------------------- ------------------- 6 5 1250317 2018-07-01 08:19:40 2018-07-01 08:19:40 23 2 1000000 2018-07-01 15:16:02 2018-07-01 15:16:02 26 1 1000000 2018-07-02 00:29:53 2018-07-02 00:29:53

試したこと

公式ドキュメントを読んだのですが、、、
理解力に乏しく分かりそうで分かりませんでした。。。
(↓のページの使用可能なバリデーションルール欄の「一意(データベース)」の項目などを読みました。)
https://readouble.com/laravel/5.6/ja/validation.html

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

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

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

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

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

m.ts10806

2018/07/02 02:07

公式ドキュメントのどのあたりを読んだかURLなどを提示されると適切なアドバイスがつきやすくなると思います。
hiroaki510

2018/07/02 02:30

申し訳ありません、追記致しました。
guest

回答2

0

uniqueを読んで実装してみましたか?
何となく、投資元本を管理しているテーブルにログインユーザがいれば、という感じで行けそうですが…

≪予想≫

投資元本テーブル(あるのか?)

user_idganpon
145,000
255,000
365,000
$validator = Validator::make($request->all(),[ 'principal' => 'filled|min:1|integer', 'user' => 'unique:投資元本テーブル,user_id' ]);

こうすると、既にuser_idが1の人が新たに投資元本を登録しようとした時に、uniqueチェックに引っかかるので弾けると思います…

投稿2018/07/02 02:51

motuo

総合スコア3027

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

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

hiroaki510

2018/07/02 04:17 編集

回答ありがとうございます。 申し訳ございません、ドキュメントを読んでいまいち理解できなかったので、実装の前に質問させていただきました。 書いてくださったコードを自分でも書きましたが、投資元本を複数入力出来てしまいました。 すみません、自分では原因がよくわかりません… 投資元本を管理しているテーブルについては、質問欄に追記致します。
motuo

2018/07/02 04:41

requestパラメータの中にuserはありますか?質問欄のViewを変更していないのであれば、チェックは出来ません。(パラメータにUserが無いので…) テストとして、<input type="text" name="user" value="5">とか入れ込んでsubmitしたらどう動きますか?弾かれませんか? この段階で躓くようでしたら、システムを組む前にもう少し手前に戻ってきちんとPHPとLaravelやFormを理解された方が良いかと思いますよ。
hiroaki510

2018/07/02 06:12

そういうことだったんですね  >パラメータにUserが無いので… 一応、自分の想定したバリデーションを組むことが出来ました。丁寧に教えていただきありがとうございました。 motuoさんの言う通り、私はまだまだ理解が足りないと思います… なので、これから頑張って自分一人で実装できるようにしたいところです。 (他のバリデーションの組み方もまだわかっていないので、また後日質問をアップしてしまいそうですが(^_^;))
guest

0

自己解決

#回答を参考にし、解決出来ました

$validator = Validator::make($request->all(),[ 'principal' => 'filled|min:1|integer', 'user' => 'unique:assets,user_id' ]);

上記のバリデーションで再入力出来てしまうのは、$requestの中に'user'が無かったからでした。
なので、resources\viewsの方を下記のように変更したところ、きちんとバリデーションが機能しました。

<form method="POST" action="/make/principal"> {{ csrf_field() }} @if($errors->has('principal')) <tr><th>ERROR</th><td>{{$errors->first('principal')}}</td></tr> @endif <tr><th>投資元本: </th><td><input type="text" name="principal" value="{{old('principal')}}"></td></tr> <tr><th></th><td><button type="submit">設定</button></td></tr> //下記を追加 @if(empty($investmentPrincipal[0])) 入力してください @else  //$investmentPrincipalはassetsテーブルのモデルクラスが代入されたもの <input type="hidden" name="user" value="{{$investmentPrincipal[0]['user_id']}}"> @endif </form>

ただ、これより良いコードがあるとおもうので、余裕があれば違う記述方法を勉強していきます。

7/5:追記
@if文でエラーメッセージを書くのはおかしいので、@foreach文でuser_idの値を送ることにしました。

<form method="POST" action="/make/principal"> {{ csrf_field() }} @if($errors->has('principal')) <tr><th>ERROR</th><td>{{$errors->first('principal')}}</td></tr> @endif <tr><th>投資元本: </th><td><input type="text" name="principal" value="{{old('principal')}}"></td></tr> <tr><th></th><td><button type="submit">設定</button></td></tr> //下記を追加  //$investmentPrincipalはassetsテーブルのモデルクラスが代入されたもの @foreach($investmentPrincipal as $principal) <input type="hidden" name="user" value="{{$principal->user_id}}"> @endforeach </form>

投稿2018/07/02 06:11

編集2018/07/08 08:06
hiroaki510

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問