组合验证规则的Laravel唯一性

时间:2019-07-04 13:31:47

标签: laravel validation unique combinations rules

我正在尝试针对两个属性的唯一组合制定验证规则。 res <- tbl2[tbl1, on="value", roll=-Inf] ## res ## value date task ## 1: 5 5 a ## 2: 10 9 b ## 3: 15 11 c ## 4: 20 20 d ## 5: 25 19 e ## 6: 30 NA f 只能选择一个Etudiant。我制作了一个表Theme,其中记录了不同的选择。这是etudiantsChoixThemes的表结构:

etudiantsChoixThemes

<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateEtudiantsChoixThemesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('etudiantsChoixThemes', function (Blueprint $table) { $table->bigIncrements('id'); $table->integer('idEtudiant'); $table->integer('idThematique'); $table->string('description'); $table->string('outils'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('etudiantsChoixThemes'); } } 刀片视图中,我可以由当前登录的studentChooseTheme做出选择

etudiant

这里是@extends('layouts.layout') @section('content') <body> {{$theme->intitule}} {{$theme->categorie}} <div class="container_fluid"> <div class="row"> <div class="alert alert-danger print-error-msg" style="display: none;"> <ul></ul> </div> <div class="alert alert-success print-success-msg" style="display: none;"> <center></center> </div> </div> </div> <form method="post" action=" {{route('registerThemeChoice', $theme->id)}} "> @csrf <fieldset>Comment comprenez-vous la thématique proposée</fieldset> <input type="hidden" name="idEtudiant" value=" {{Auth::guard('web')->user()->id}} "> <input type="hidden" name="idThematique" value=" {{$theme->id}} "> <textarea name="description" required> {{old('description')}} </textarea> <fieldset>Quels outils comptez-vous utiliser pour mener à bien le projet?</fieldset> <textarea name="outils" required> {{old('outils')}} </textarea> <input class="button-info" type="submit" name="submit" id="submit" value="Valider"> </form> <a href=" {{url('themes/' .$theme->id)}} "><button class="button-danger">Annuler</button></a> </body> @jquery <script type="text/javascript"> $(function(){ $('#submit').on('click', function(e){ e.preventDefault(); var _token = $("input[name='_token']").val(); var idEtudiant = $('input[name=idEtudiant]').val(); var idThematique = $('input[name=idThematique]').val(); var description = $('textarea[name=description]').val(); var outils = $('textarea[name=outils]').val(); $.ajax({ url: "{{route('registerThemeChoice',$theme->id)}}", type: 'POST', data: { _token:_token, idEtudiant:idEtudiant, idThematique:idThematique, description:description, outils:outils }, success: function(data){ if($.isEmptyObject(data.error)){ // alert(data.success); $('.print-error-msg').css('display','none'); toastr.success(" Votre choix est enregistré "); } else{ // console.log(data.error); printErrorMsg(data.error); } } }); function printErrorMsg (msg) { $(".print-error-msg").find("ul").html(''); $(".print-error-msg").css('display','block'); $.each( msg, function( key, value ) { $(".print-error-msg").find("ul").append('<li>'+value+'</li>'); }); } }); }); </script> @endsection

studentChooseThemeController

我正在用ajax提交它,它对于ajax部分的工作正常。 我的问题是验证。就像我上面所说的,我想对<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Theme; use App\EtudiantsChoixTheme; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; class studentChooseThemeController extends Controller { public function index($id){ $theme = Theme::findOrFail($id); return view('studentChooseTheme', ['theme' => $theme]); } public function etudiantChoixTheme(Request $request, $id){ // $theme = Theme::findOrFail($id); $validator = Validator::make($request->all(),[ 'description' => 'required', 'outils' => 'required', 'idThematique' => Rule::unique('etudiantsChoixThemes')->where(function ($query) use($idEtudiant, $idThematique) { return $query->where('idEtudiant', $idEtudiant) ->where('idThematique', $idThematique); }), ]); if ($validator->fails()) { return response()->json(['error'=>$validator->errors()->all()]); } $etudiantChoixTheme = new EtudiantsChoixTheme; $etudiantChoixTheme->idEtudiant = $request->input('idEtudiant'); $etudiantChoixTheme->idThematique = $request->input('idThematique'); $etudiantChoixTheme->description = $request->input('description'); $etudiantChoixTheme->outils = $request->input('outils'); $etudiantChoixTheme->save(); } } idEtudiant组合一个唯一的规则:idThematique只能选择一次Etudiant,因此数据库中会有一个ThemeidEtudiant的唯一组合。

我发现了一些here,并将其应用到了idThematique的控制器代码中。但是我没有得到预期的结果。

我也尝试过这个:

idThematique

和这个:

$validator = Validator::make($request->all(),[
            'description' => 'required',
            'outils' => 'required',
            'idThematique' =>'unique:etudiantsChoixThemes,idThematique,'.$this->id.',NULL,id,idEtudiant'. $request->input('idEtudiant'),
        ]);

$validator = Validator::make($request->all(),[ 'description' => 'required', 'outils' => 'required', 'idThematique' =>'unique:etudiantsChoixThemes,idThematique,NULL,id,idEtudiant'. $request->input('idEtudiant'), ]); 组合仍然可以记录多次。另外,我已经注意到,在上面的最后两个代码块中,验证不再起作用了(对于unique部分而言)。我在这里想念什么吗?非常欢迎您的帮助。我正在使用laravel 5.8

1 个答案:

答案 0 :(得分:0)

你快到了。

未设置传递给$idEtudiant函数的变量$idThematiquewhere()

这应该有效:

'idThematique' => Rule::unique('etudiantsChoixThemes')->where(function ($query) {
                return $query->where('idEtudiant', request('idEtudiant'))
                    ->where('idThematique', request('idThematique'));
            })