選手登録フォームを作成しています。
選手登録フォームからデータ登録する際に未定義であるという下記のエラーがでております。
Call to undefined method Illuminate\Contracts\Validation\Rule::unique()
##実現したいこと1
テーブルの「team_owner_id」で絞り込んでから「player_no」をuniqueとしてバリデーションしたい。
例:team_owner_idが1、player_noが10が既に登録済みとした場合
team_owner_idが1、player_noが10の登録はできない。
team_owner_idが2、player_noが10の登録はできる。
##テーブル playersテーブル
team_owner_idは、別で作成済みのteam_ownerテーブルとリレーションしています。
###前提
選手登録をするteam_ownerは、ログインをしておりAuth::id()とteam_owner_idの数字は同じである。
選手登録をするcreate.blade.phpは、他のteam_owner_idを選択することはできない。
PlayerController
1public function store(Request $request) 2 { 3 $request->validate([ 4 'player_no' => [new Player_no_check], 5 6 ]); 7 8 $player = new Player(); 9 $player->team_owner_id = Auth::id(); 10 $player->player_no = $request->player_no; 11 $player->player_name = $request->player_name; 12 $player->save(); 13 // dd($player); 14 return redirect() 15 ->route('team_owner.players.index') 16 ->with([ 17 'message' => '選手登録をしました。', 18 'status' => 'info' 19 ]); 20 }
※下記のバリデーションは自分が分かりやすくなるように「player_no」のみ指定しています。
Rule\Player_no_check
1public function passes($attribute, $value) 2 { 3 return [ 4 'player_no' => Rule::unique('players')->where(function ($query) { 5 return $query->where('team_owner_id', 1); 6 }) 7 ]; 8 }
##参考にしたサイト
参考サイト1
##試してみたこと1
参考サイトなどをみて、「Player_no_check.php」のようにバリデーションルールを作成したつもりでしたが
記述が間違っているようで未定義となっております。
ここからがどうして良いのかわからず質問にいたりました。
どのようにするとバリデーションを希望のバリデーションを通すことができますでしょうか。
どうぞよろしくお願いいたします。
##現在でているエラー内容
修正後の記述
player_no_check.php
1namespace App\Rules; 2 3// use Illuminate\Contracts\Validation\Rule; 4use Illuminate\Validation\Rule; 5use App\Models\Team_owner; 6use App\Models\Player; 7 8 9 10class Player_no_check extends Rule 11{ 12 /** 13 * Create a new rule instance. 14 * 15 * @return void 16 */ 17 public function __construct() 18 { 19 // 20 } 21 22 /** 23 * Determine if the validation rule passes. 24 * 25 * @param string $attribute 26 * @param mixed $value 27 * @return bool 28 */ 29 public function passes($attribute, $value) 30 { 31 dd($attribute, $value); 32 return [ 33 'player_no' => Rule::unique('players')->where(function ($query) { 34 return $query->where('team_owner_id', 1); 35 }) 36 ]; 37 } 38 39 /** 40 * Get the validation error message. 41 * 42 * @return string 43 */ 44 public function message() 45 { 46 return 'The validation error message.'; 47 } 48}
Error Object of class App\Rules\Player_no_check could not be converted to string
##試してみたこと2
下記の記述を試したところ「syntax error, unexpected ';', expecting ']'」が表示されました。
Player_no_check.php
1 public function passes($attribute, $value) 2 { 3 return [ 4 'player_no' => Player::where('player_no',$value) 5 ->where('team_owner_id', 1) 6 ->doesntExist(); 7 ]; 8 }
下記に変更をすると「syntax error」はなくなりましたが記述が合っているか自信がありません。
Player_no_check.php
1public function passes($attribute, $value) 2 { 3 4 return [ 5 'player_no' => Player::where('player_no', $value) 6 ->where('team_owner_id', 1)->doesntExist(), //「;」を「,」に変更 7 ]; 8 }
PlayerController
1public function store(Request $request) 2 { 3 $request->validate([ 4 'player_no' => [new Player_no_check], 5 6 ]); 7 8 $player = new Player(); 9 $player->team_owner_id = Auth::id(); 10 $player->player_no = $request->player_no; 11 $player->player_name = $request->player_name; 12 $player->save(); 13 // dd($player); 14 return redirect() 15 ->route('team_owner.players.index') 16 ->with([ 17 'message' => '選手登録をしました。', 18 'status' => 'info' 19 ]); 20 } 21
この状態で選手の新規登録をおこないました。
結果としては、登録がなんでもできてしまいバリデーションが効いていないような感じになっています。
現在のteam_owner_idが1、player_noを10として何度も登録ができてしまう状態です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/08 10:43
2021/12/09 01:12
2021/12/09 02:51
2021/12/09 11:47
2021/12/09 12:54
2021/12/09 14:08