Подтвердить что ты не робот

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

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

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

Существует несколько Обходных решений, которые я нашел, но для этого должен быть некоторый "красноречивый" способ. Мой ожидаемый результат был бы таким (это было бы прекрасно!):

array('draft','published')

Заранее благодарю вас!

4b9b3361

Ответ 1

К сожалению, 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');

Ответ 2

Сделано небольшое улучшение функции лукасгейтера. Цикл 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] : [];
}

Ответ 3

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

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

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

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

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