📜  laravel 枚举迁移示例 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:37.395000             🧑  作者: Mango

Laravel 枚举迁移示例

在 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 字段是一个枚举类型,只能选择 malefemale 两个值。在 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');
    }
}