Laravel 5

Form Request et Table Pivot

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Bonjour à tous,

    Je suis en train de coder un site de vidéo et chacune de mes vidéos peuvent faire partie de plusieures catégories. Pour cela j'ai créer une table pivot avec une relation belongToMany, j'ai fais un système de checkbox et dans mon controller j'ai utiliser la fonction sync via mon model.

    J'aimerais verrifier dans ma class Form Request que les id que je sync contenu dans un array categorie_video_id existe bien dans ma table categories pour assurer l'intégrité de ma bdd.

    Pour le moment j'ai mis:
    'categorie_video_id':'required|array'

    Mais je ne sais pas comment faire pour verrifier le contenu de mon array!

    Merci d'avance

    Methos

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    264

    Bonjour c'est ceci que vous cherchez ? : https://laravel.com/docs/5.8/validation#rule-exists

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Oui et non, car ce qui va être testé c'est un array, n'est ce pas ? Est ce que cette regle regarde le contenu de l'array pour savoir si son contenu est présent ou pas dans la table ?

    ex: [1,2,8,9] => est ce que les id 1-2-8-9 font parti de la table catégorie ?

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    264

    Vous pouvez alors faire un custom validate, qui va boucler sur ce tableau et appliquer la règle du database exist()

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Mais cela veut dire que pour chaque itération de la boucle, laravel va faire une requête pour verrifier si l'id existe dans la bdd ? C'est pas très optimisé non ?

    Pourquoi ne pas faire un custom validate qui récupère toutes les catégories et ensuite je boucle sur les catégories de ma vidéo et je fais juste un in_array() ?

    N'y a t'il pas façon inclu dans laravel ?

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    264

    Alors dans ce cas autant faire une requêtes qui fais un in (dans le select) dans la db , moins lourd que des in_array

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    J'y avais pensé mais en quoi c'est une verrification ? Si dans mon select j'ai in (1,2,3,8,9) et que 9 n'est pas une catégorie, il va juste mes selectionner toutes les autres ? Est ce que je me trompe ?

    Edit: ou c'est juste pour réduire la taille de l'array ?

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    264

    Je n'ai pas bien la structure en tête, mais l'un ou l'autre c'est la solution :)

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Vous n'avez pas quelle structure en tête ? ^^

  • Avatar de nash
    Membre depuis :
    16/04/2019
    Messages :
    14

    categorie_video_id existe bien dans ma table categories pour assurer l'intégrité de ma bdd.

    Pourquoi tu supprime les catégories

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Pourquoi tu supprime les catégories

    Je ne comprend pas la question :s
    Je ne supprime pas les catégories, je veux juste que chacun des id présents dans ma table pivot correspondent bien à une catégorie de vidéo :)

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Bonjour, voila la règle de validation que j'ai mis en place:

    Validator::extend('video_categories', function($attribute, $value, $parameters, $validator) {
    $bddCategorie = DB::table('video_categories')->select('id')->whereIn('id', $value)->get();
    return $bddCategorie->pluck('id')->diffAssoc($value)->isEmpty();
    });

    Vous en pensez quoi ?

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Petit up :D

  • Avatar de alexisgeneau
    Membre depuis :
    16/05/2019
    Messages :
    3

    Je pense que tu peux optimiser comme ça :

    Validator::extend('video_categories', function($attribute, $value, $parameters, $validator) {

    $categories_count = DB::table('video_categories')->whereIn('id', $value)->count();

    return categories_count === count($value);

    });

Vous ne pouvez pas répondre à ce sujet.