уникальность правила проверки комбинации - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь создать правило проверки уникальной комбинации двух атрибутов.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

<?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

1 Ответ

0 голосов
/ 05 июля 2019

Ты почти у цели.

Переменные $idEtudiant и $idThematique, проходящие через функцию where(), не установлены.

Это должно работать:

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