Besoin d'aide ?

Stocker les statuts de mon Model

  • Avatar de NinelGuitoune
    Membre depuis :
    05/03/2018
    Messages :
    5

    Bonjour à tous,

    Je gère des réservations dans mon application avec un Model Reservation. Je gère aussi des statuts de réservation (En cours, Abandonné, etc.) je les ai stocké dans une table statuts_reservation.
    Les statuts n'ont pas vocation à être changés à partir de l'application, aussi, je ne trouve pas ça très propre de les stocker en base ainsi que de créer un Model associé.
    Quel sont les moyens alternatifs efficaces pour les stocker proprement (j'imagine dans une table de mon modèle Réservation) et y accéder aussi de manière propre (tant du point de vue syntaxe que style) ?

    Merci de votre aide !

    Arnaud

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

    Bonjour,

    C'est vrai que stocker des valeurs qui ne changeront jamais dans un base de données peut sembler inadéquat. Mais si ces données doivent interagir avec d'autres données qui elles sont dans la base ça devient incontournable.

    Pour le cas des statuts de réservation pourquoi ne pas simplement créer un type ENUM dans la table des réservations ?

  • Avatar de NinelGuitoune
    Membre depuis :
    05/03/2018
    Messages :
    5

    Bonjour bestmomo,
    merci pour ta réponse.
    Je n'avais jamais travaillé avec les enums, du coup j'ai regardé un epu tout ça, merci pour la piste !
    Je vois deux possibilités d'implémentations pour cette énumération :
    Utiliser une colonne de type enum dans la BD :

    $table->enum('level', ['easy', 'hard']);

    Soit une version simple de ma propre enum :

    abstract class PhoneType extends Enum {
    const Cell = "Cellular";
    const Home = "Home";
    const Work = "Work";
    }

    abstract class Enum {
    static function getKeys(){
    $class = new ReflectionClass(get_called_class());
    return array_keys($class->getConstants());
    }
    }

    Plus de détails sur une éventuelle implémentation dans le genre : https://stackoverflow.com/questions/254514/php-and-enumerations

    Par contre, je peux être amené à changer mes statuts de réservation (par exemple rajouter, une étape de validation, ou un refus).
    Quelle solution te semble préférable :

    • Stocker cela dans une classe ?
    • Ou bien cela te parait il Okay d'effectuer une migration à chaque fois que je souhaite modifier ma liste de statuts (pas forcément souvent :))?

    Arnaud

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

    Personnellement j'adopterais la solution ENUM pour sa simplicité et pour sa parfaite intégration au schéma.

    Mais de mémoire il y a un souci avec des modifications par migration dès qu'il y a un champ ENUM dans une table. J'ai retrouvé cet article. Mais on peut le faire directement sur la base sans passer par la migration tout en la mettant à jour pour rester cohérent.

    Il y a eu pas mal de débats sur le type ENUM, perso je l'aime bien. Il est toujours possible de l'éviter en créant un table dédiée...

  • Avatar de NinelGuitoune
    Membre depuis :
    05/03/2018
    Messages :
    5

    Merci pour les compléments d'information sur les ENUM, finalement je suis parti sur un petit peu autre chose !
    https://github.com/spatie/laravel-model-status
    Cela correspond bien à mes besoins, avec de la traçabilité sur les statuts mais aussi avec la possibilité d'associer une justification de changement de statut.

    Le bémol initial qui me gênait et qui m'a poussé à poster ici, c'était que je n'étais pas sûr que mes statuts sont bien cohérents avec soit les valeurs d'une table ou d'une variable.
    Au final, il y a une fonction qui me permet de gérer cela dans mon modèle :

    protected $statuts = [
    "En attente confirmation",
    "Confirmée",
    "Annulée",
    "À replacer",
    "Refusée"
    ];

    public function isValidStatus(string $name, string $description = '') : bool
    {
    if (!in_array($name, $this->statuts)) {
    return false;
    }

    return true;
    }

    Merci pour l'aide,

    Arnaud

Vous ne pouvez pas répondre à ce sujet.