在 laravels 中获取枚举选项雄辩

2022-08-30 18:31:07

在我的迁移文件中,我为表提供了一个包含 2 个可能值的字段(如下所示)。我的问题是,是否可以用Laravers Eloquent选择这些值?pagesenum

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

我发现了几种解决方法,但必须有一些“雄辩的本机”方法来处理这个问题。我预期的输出将是这样的(这将是完美的!

array('draft','published')

提前感谢您!


答案 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

对 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] : [];
}

推荐