Получить перечисление вариантов в красноречивых laravels

В моем файле миграции я дал свою таблицу pages enum поле с 2 возможными значениями (как показано ниже). Мой вопрос, если возможно выбрать эти значения с помощью Laravels красноречивый?

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

Я нашел несколько обходных путей, но должен быть какой-то «красноречивый» способ справиться с этим. Мой ожидаемый результат будет следующим (это было бы прекрасно!):

array('draft','published')

Заранее спасибо!

13

Решение

К сожалению, Laravel не предлагает решения для этого. Вам придется сделать это самостоятельно. Я покопался и нашел этот ответ

Вы можете использовать эту функцию и превратить ее в метод в классе вашей модели …

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

И вы используете это так

$options = Page::getPossibleStatuses();

Если вы хотите, вы также можете сделать его более универсальным и общим.

Сначала создайте BaseModel, Все модели должны выходить из этого класса

class BaseModel extends Eloquent {}

После этого поместите эту функцию туда

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

Вы называете это так

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

Другие решения

Сделано небольшое улучшение функции lukasgeiter. Цикл foreach в своем ответе разбирает строку. Вы можете обновить регулярное выражение, чтобы сделать это для вас.

/**
* 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

Начиная с L5.17 Eloquent не включает эту функциональность, вместо этого вам нужно вернуться к собственному QL. Вот пример, который будет работать с SQL и в одну строку — возвращать массив, как вы просили.

В духе одного лайнера сложность;)

Я бросил это в один из моих композиторов представления — он выбирает столбец из таблицы, разбирает его и собирает значения в массив.

Я повторяю это в своих взглядах, используя foreach.

explode (
"','",
substr (
DB::select("  SHOW COLUMNS
FROM ".(new \Namespace\Model)->getTable()."LIKE 'colName'")[0]->Type,
6,
-2
)
);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector