2014-11-18 9 views
11

W moim pliku migracji podałem tabelę pages z polem enum z 2 możliwymi wartościami (jak widać poniżej). Moje pytanie brzmi, czy można wybrać te wartości za pomocą Laravels Epoquillery?Uzyskaj opcje wyliczania w elokwentnym obiekcie laravels

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

Istnieje kilka obejść, które znalazłem, ale musi istnieć jakiś "elokwentny-rodzimy" sposób radzenia sobie z tym. Mój oczekiwany wynik byłby ten (to byłoby idealne!):

array('draft','published') 

Z góry dziękuję!

Odpowiedz

12

Niestety, Laravel nie oferuje rozwiązania tego problemu. Będziesz musiał to zrobić sam. Zrobiłem trochę kopanie i stwierdziliśmy this answer

Można użyć tej funkcji i przekształcić go w sposób w swojej klasie modelu ...

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

I go używać jak to

$options = Page::getPossibleStatuses(); 

If chcesz, możesz również uczynić go bardziej uniwersalnym i uniwersalnym. Najpierw utwórz BaseModel. Wszystkie modele powinny następnie rozciągać się od tej klasy

class BaseModel extends Eloquent {} 

Po tym, umieścić tę funkcję tam

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

Nazywasz to kogoś takiego

$options = Page::getPossibleEnumValues('status'); 
+2

Dlaczego nie użyć w tym celu dedykowanej cechy? – ozanmuyes

+0

Oczywiście możesz użyć cechy, jeśli chcesz – lukasgeiter

+0

Laravel powinien dodać to do każdej Eloquent Class, może jako Cecha –

0

As z L5.17 Eloquent robi nie obejmują tej funkcji, zamiast tego musisz wrócić do macierzystej QL. Oto przykład, który będzie działał z SQL i w jednym wierszu - zwracając tablicę, o którą prosiłeś.

W duchu jednego złożoności liniowej;)

Rzuciłem to w jednym z moim zdaniem twórców - to pobiera kolumnę z tabeli rozbija ją i zbiera wartości w tablicy.

I iteracji nad tym w moich poglądach za pomocą foreach.

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

Wprowadzono niewielką poprawę funkcji lukasgeitera. Pętla foreach w jego odpowiedzi analizuje ciąg znaków. Możesz zaktualizować wyrażenie regularne, aby zrobić to za Ciebie.

/** 
* 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] : []; 
} 
Powiązane problemy