php taggable - Où mettre / comment gérer les énumérations à Laravel?



trait relations (5)

Laravel a un assistant de <select> qui prend en entrée un dictionnaire. J'aime garder les valeurs pour tous dans un endroit central. Par exemple, je pourrais avoir une énumération qui ressemble à ceci:

$phoneTypes = [
    'CELL' => "Cellular",
    'HOME' => "Home",
    'WORK' => "Work",
];

Ce que je veux utiliser à la fois dans ma vue / mon modèle et dans la base de données:

Schema::create('customers', function (Blueprint $table) {
    $table->increments('id');
    $table->enum('pri_phone_type',array_keys($phoneTypes));
    ...
});
  1. Y a-t-il un endroit recommandé pour les mettre?
  2. Puis-je les rendre globales pour pouvoir y accéder facilement dans toutes mes vues?

Answers

Juste eu le même problème, pour moi Eloquent Accessors et les mutateurs ont fonctionné le mieux. Pour cette question ça irait comme:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
    /**
    * @var array
    */
    protected $phoneTypes = [
        'Cellular',
        'Home',
        'Work'
    ];

   /**
    * @param int $value
    * @return string|null
    */
    public function getPhoneTypeAttribute($value)
    {
        return Arr::get($this->phoneTypes, $value);
    }
}

S'il vous plaît noter que dans la base de données, vous devriez enregistrer des valeurs numériques, où 0 est la cellule, 1 est la maison et 2 est le travail. Deuxièmement, il serait judicieux d'utiliser des traductions ici plutôt que des propriétés protégées.


Personnellement, enum complètement un type de colonne enum DB. Les types de colonnes enum base de données peuvent être problématiques, voir ici pour un article sur ce sujet.

Gestion des énumérations dans la base de données via des relations

Si vous voulez vraiment gérer votre liste dans la base de données, je phone_types table de base de données phone_types distincte et phone_types une relation avec la table de vos customers .

Gestion des énumérations dans votre code via config Laravel

Il est également très facile de gérer vos énumérations en code et d’éviter complètement la base de données.

Puisque vous utilisez Laravel, je pense que la mise en place d’un fichier de configuration serait une option viable.

Supposons que vous créez un nouveau fichier config/enums.php avec les éléments suivants:

return [
    'phone_types' => [
        'CELL' => "Cellular",
        'HOME' => "Home",
        'WORK' => "Work",
    ]
];

Vous pouvez maintenant le remettre à l'aide-formateur assez facilement:

Form::select('phone', Config::get('enums.phone_types'));

En plus de la réponse de @ Banford:

J'ai récemment mis en place un package qui rend le travail avec les enums à Laravel beaucoup plus agréable. C'est une combinaison de diverses implémentations que j'ai trouvées en recherchant comment faire exactement la même chose (donc pourquoi je suis ici).

https://github.com/BenSampo/laravel-enum

Dans ce cas, vous pourriez faire quelque chose comme ceci:

final class PhoneTypes extends Enum
{
    const Cellular = 0;
    const Work = 1;
    const Home = 2;
}

On peut alors accéder aux valeurs en utilisant:

PhoneTypes::Work // 1

Je recommanderais de toujours définir les valeurs sur des nombres entiers et de les stocker ensuite dans le DB sous forme d'ints.

La classe de base Enum a des méthodes pour obtenir toutes les clés et valeurs en tant que tableaux. Le package présente également quelques autres avantages qui peuvent être utiles dans ce cas, tels que la validation, afin que l'utilisateur ne puisse pas ajouter une valeur inexistante à la base de données.

Il y a aussi un générateur qui est très pratique.

J'espère que cela sera utile pour quelqu'un.


Je ne suis pas d'accord avec la réponse acceptée ici. Je pense que les énumérations peuvent être très utiles pour ce genre de chose. Je préfère traiter les énumérations comme des types et implémenter les méthodes dont vous avez besoin sur la classe de base Enum pour vous donner les fonctionnalités dont vous avez besoin, telles que l'obtention d'un dictionnaire.

Mon exemple simple ci-dessous:

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());
    }
}

Exemple d'utilisation:

PhoneType::getKeys();

Voir PHP et Enumérations pour plus de détails et un exemple plus détaillé.


Si vous voulez obtenir un entier pour la valeur enum qui est stockée dans une variable, dont le type serait Question , à utiliser par exemple dans une méthode, vous pouvez simplement faire ceci que j'ai écrit dans cet exemple:

enum Talen
{
    Engels = 1, Italiaans = 2, Portugees = 3, Nederlands = 4, Duits = 5, Dens = 6
}

Talen Geselecteerd;    

public void Form1()
{
    InitializeComponent()
    Geselecteerd = Talen.Nederlands;
}

// You can use the Enum type as a parameter, so any enumeration from any enumerator can be used as parameter
void VeranderenTitel(Enum e)
{
    this.Text = Convert.ToInt32(e).ToString();
}

Cela changera le titre de la fenêtre à 4 parce que la variable Geselecteerd est Talen.Nederlands . Si je le change à Talen.Portugees et appelle à nouveau la méthode, le texte passera à 3.

J'ai eu du mal à trouver cette solution simple sur Internet et je n'ai pas pu la trouver, alors j'ai testé quelque chose et je l'ai découvert. J'espère que cela t'aides. ;)





php laravel enums