web-dev-qa-db-fra.com

Obtenez des options enum dans laravel éloquent

Dans mon fichier de migration, j'ai attribué à ma table pages un champ enum avec 2 valeurs possibles (voir ci-dessous). Ma question est la suivante: s’il est possible de sélectionner ces valeurs avec Laravels Eloquent ?

$table->enum('status', array('draft','published'));

J'ai trouvé plusieurs solutions de contournement, mais il doit exister une méthode "native-éloquente" pour gérer cela. Ma sortie attendue serait la suivante (ce serait parfait!):

array('draft','published')

Merci d'avance!

13
barfoos

Malheureusement, Laravel n'offre pas de solution à cela. Vous devrez le faire vous-même. J'ai creusé et trouvé cette réponse

Vous pouvez utiliser cette fonction et la transformer en méthode dans votre classe de modèle ...

class Page extends Eloquent {

    public static function getPossibleStatuses(){
        $type = DB::select(DB::raw('SHOW COLUMNS FROM pages WHERE Field = "type"'))[0]->Type;
        preg_match('/^enum\((.*)\)$/', $type, $matches);
        $values = array();
        foreach(explode(',', $matches[1]) as $value){
            $values[] = trim($value, "'");
        }
        return $values;
    }
}

Et vous l'utilisez comme ça

$options = Page::getPossibleStatuses();

Si vous le souhaitez, vous pouvez également le rendre un peu plus accessible et générique.

Commencez par créer une BaseModel. Tous les modèles doivent alors sortir de cette classe

class BaseModel extends Eloquent {}

Après cela, mettez cette fonction là

public static function getPossibleEnumValues($name){
    $instance = new static; // create an instance of the model to be able to get the table name
    $type = DB::select( DB::raw('SHOW COLUMNS FROM '.$instance->getTable().' WHERE Field = "'.$name.'"') )[0]->Type;
    preg_match('/^enum\((.*)\)$/', $type, $matches);
    $enum = array();
    foreach(explode(',', $matches[1]) as $value){
        $v = trim( $value, "'" );
        $enum[] = $v;
    }
    return $enum;
}

Vous appelez celui-ci comme ça

$options = Page::getPossibleEnumValues('status');
13
lukasgeiter

Fait une petite amélioration à la fonction de lukasgeiter. La boucle foreach dans sa réponse analyse la chaîne. Vous pouvez mettre à jour la regex pour le faire pour vous.

/**
 * Retrieves the acceptable enum fields for a column
 *
 * @param string $column Column name
 *
 * @return array
 */
public static function getPossibleEnumValues ($column) {
    // Create an instance of the model to be able to get the table name
    $instance = new static;

    // Pulls column string from DB
    $enumStr = DB::select(DB::raw('SHOW COLUMNS FROM '.$instance->getTable().' WHERE Field = "'.$column.'"'))[0]->Type;

    // Parse string
    preg_match_all("/'([^']+)'/", $enumStr, $matches);

    // Return matches
    return isset($matches[1]) ? $matches[1] : [];
}
2
TheNatureBoy

À partir de la version L5.17, Eloquent n'inclut pas cette fonctionnalité. Vous devez plutôt utiliser QL en mode natif. Voici un exemple qui fonctionnera avec SQL et sur une ligne - renvoyant un tableau comme vous l’aviez demandé.

Dans l'esprit de la complexité d'un liner;)

Je l’ai jeté dans l’un de mes compositeurs - il extrait la colonne de la table, l’explose et assemble les valeurs dans un tableau.

Je revisite cela dans mes vues en utilisant un foreach.

explode (
    "','",
    substr (
      DB::select("  SHOW COLUMNS 
                    FROM ".(new \Namespace\Model)->getTable()." 
                    LIKE 'colName'"
      )[0]->Type,
      6,
      -2
    )
);
0
dom_hutton