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!
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');
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] : [];
}
À 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
)
);