📅  最后修改于: 2023-12-03 15:02:37.395000             🧑  作者: Mango
在 Laravel 中,枚举类型也可以存储在数据库中。使用枚举类型可以限制在指定的一组值中进行选择,比如性别只能为男或女。
首先我们需要在数据库中创建一个枚举类型,可以使用 Laravel 的迁移工具来完成。在命令行中输入以下命令:
php artisan make:migration create_enum_migration --create=enums
其中 create_enum_migration
是迁移文件名称,可以自定义。--create=enums
指定迁移操作的数据表名称为 enums
。
在生成的迁移文件中,我们需要使用 DB::statement()
方法创建枚举类型。示例代码如下:
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEnumMigration extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('enums', function (Blueprint $table) {
$table->id();
$table->enum('gender', ['male', 'female']);
$table->timestamps();
});
DB::statement("ALTER TABLE enums MODIFY gender ENUM('male', 'female')");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::statement("ALTER TABLE enums MODIFY gender VARCHAR(255)");
Schema::dropIfExists('enums');
}
}
其中 gender
字段是一个枚举类型,只能选择 male
或 female
两个值。在 up()
方法中使用 DB::statement()
方法创建该枚举类型,在 down()
方法中撤销操作。
注意,在 up()
方法中,还需要使用 ALTER TABLE
语句将字段类型修改为枚举类型。
创建完枚举类型后,我们就可以在模型或控制器中使用该枚举类型了。示例代码如下:
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $fillable = ['name', 'gender'];
protected $casts = [
'gender' => 'enum',
];
public const GENDER_MALE = 'male';
public const GENDER_FEMALE = 'female';
}
在模型中,使用 $casts
属性将 gender
字段转换为枚举类型。这样,在获取或保存数据时,gender
字段都会自动转换为枚举类型。
同时,在模型中,我们还可以定义常量表示可选的枚举值,方便我们在代码中使用。
Laravel 中使用枚举类型存储数据,可以方便地限制字段可选的值,并提高代码的可读性。最终代码如下:
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEnumMigration extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('enums', function (Blueprint $table) {
$table->id();
$table->enum('gender', ['male', 'female']);
$table->timestamps();
});
DB::statement("ALTER TABLE enums MODIFY gender ENUM('male', 'female')");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::statement("ALTER TABLE enums MODIFY gender VARCHAR(255)");
Schema::dropIfExists('enums');
}
}