laravel 组合验证规则的唯一性
laravel uniqueness of combination validation rule
我正在尝试对两个属性的唯一组合制定验证规则。一个Etudiant
只能选择一次Theme
。我做了一个table etudiantsChoixThemes
记录了不同的选择。这是 etudiantsChoixThemes
的 table 结构:
<?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
blade 视图,我可以在其中获得当前登录 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
<?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();
}
}
我用 ajax 提交它,它对于 ajax 部分的内容工作正常..
我的问题是验证。正如我上面的意思,我想要一个关于 idEtudiant
和 idThematique
组合的唯一规则:一个 Etudiant
只能选择一次 Theme
,所以数据库中会有一个idEtudiant
与 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
组合仍然可以记录多次。另外我注意到上面最后两个代码块,验证不再起作用(对于 required
部分)。我在这里错过了什么..?非常欢迎您的帮助。我正在使用 laravel 5.8
你快到了。
未设置传递给 where()
函数的变量 $idEtudiant
和 $idThematique
。
这应该有效:
'idThematique' => Rule::unique('etudiantsChoixThemes')->where(function ($query) {
return $query->where('idEtudiant', request('idEtudiant'))
->where('idThematique', request('idThematique'));
})
我正在尝试对两个属性的唯一组合制定验证规则。一个Etudiant
只能选择一次Theme
。我做了一个table etudiantsChoixThemes
记录了不同的选择。这是 etudiantsChoixThemes
的 table 结构:
<?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
blade 视图,我可以在其中获得当前登录 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
<?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();
}
}
我用 ajax 提交它,它对于 ajax 部分的内容工作正常..
我的问题是验证。正如我上面的意思,我想要一个关于 idEtudiant
和 idThematique
组合的唯一规则:一个 Etudiant
只能选择一次 Theme
,所以数据库中会有一个idEtudiant
与 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
组合仍然可以记录多次。另外我注意到上面最后两个代码块,验证不再起作用(对于 required
部分)。我在这里错过了什么..?非常欢迎您的帮助。我正在使用 laravel 5.8
你快到了。
未设置传递给 where()
函数的变量 $idEtudiant
和 $idThematique
。
这应该有效:
'idThematique' => Rule::unique('etudiantsChoixThemes')->where(function ($query) {
return $query->where('idEtudiant', request('idEtudiant'))
->where('idThematique', request('idThematique'));
})