Besoin d'aide ?

Contrainte unique sur plusieurs colonnes dans la validation

  • Avatar de KaderData
    Membre depuis :
    14/07/2019
    Messages :
    2

    Bonjour,

    Je suis en train de développer une API et j'ai un problème concernant ma contrainte d'unicité.

    Schema::create('configurations', function (Blueprint $table) {
    $table->increments('id');
    $table->string('categorie');
    $table->string('champ');
    $table->string('libelle');
    $table->timestamps();
    $table->unique(['categorie', 'champ', 'libelle']);
    });

    Comme vous pouvez le voir, ma contrainte porte sur plusieurs colonnes de ma table. Après quelque recherche j'ai trouvé qu'il fallait que j'utilise la règle unique dans ma classe FormRequest mais celle ci n'applique uniquement sur une colonne et non plusieurs colonnes comme dans mon cas.

    Voilà

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2569

    Bonjour,

    Il n'y a pas de méthode standard pour ça mais peut-être ce package fera l'affaire.

  • Avatar de KaderData
    Membre depuis :
    14/07/2019
    Messages :
    2

    Merci de ta réponse. Après avoir lu la documentation, j'ai réussi à trouver exactement ce que je voulais.

    Dans mon contrôleur, j'ai une méthode store qui me permet d'enregistrer les données provenant de formulaire par rapport au requête HTTP.

    public function store(StoreConfigurationRequest $request)
    {
    $configuration = $request->isMethod('put') ? Configuration::findOrFail($request->id) : new Configuration;
    $configuration->categorie = $request->get('categorie');
    $configuration->champ = $request->get('champ');
    $configuration->libelle = $request->get('libelle');

    if ($configuration->save()) {
    return new ConfigurationResource($configuration);
    }
    }

    J'ai une classe StoreConfigurationRequest qui hérite de FormRequest qui me permet de valider les données et j'ai crée ma porte règle de validation qui permet de vérifier qu'une configuration n'existe pas.

    public function __construct(Factory $validationFactory)
    {
    $validationFactory->extend(
    'uniqueCategorieChampLibelle',
    function ($attribute, $value, $parameters) {
    $counter = DB::table('configurations')
    ->where(['categorie' => $this->request->get('categorie'),
    'champ' => $this->request->get('champ'),
    'libelle' => $this->request->get('libelle')])
    ->count();
    return 0 === $counter;
    },
    'Cette configuration existe déjà.'
    );
    }

Vous ne pouvez pas répondre à ce sujet.