2014-11-18 5 views
11

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

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

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

array('draft','published') 

Спасибо заранее!

ответ

12

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

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

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

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

Сначала создайте 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

Почему бы не использовать выделенный признак для этого? – ozanmuyes

+0

Уверенный, что вы можете использовать признак, если хотите – lukasgeiter

+0

Laravel должен добавить это в каждый класс Eloquent, возможно, в качестве признака –

0

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

В духе одной сложности вкладыша;)

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

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

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

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