【问题标题】:Laravel database migration nullable in a lot of columnsLaravel 数据库迁移在很多列中可以为空
【发布时间】:2019-05-29 16:38:15
【问题描述】:

我正在为一个包含很多列的表编写 Laravel 迁移文件,而其中大多数应该是 nullable(不幸的是有些不是)。这导致我编写重复的代码,例如:

Schema::create('my_table', function (Blueprint $table) {
    $table->increments('id');
    $table->string('col_1')->nullable();
    $table->string('col_2')->nullable();
    $table->string('col_3')->nullable();
    // ...
    // (Note that col_1 etc can be different names instead of incrementing by no.)
});

有没有办法默认设置表蓝图nullable(无需显式调用nullable()),或者一次将nullable分配给所有想要的列?或者是否有其他方法(最好在迁移文件中)来做到这一点?

【问题讨论】:

  • 您总是可以将 ColumnDefinitions 放在一个数组中,然后在每个数组上调用 nullable()。或者,您可以通过 Macroable 接口扩展蓝图。有很多方法可以做到这一点而无需重复自己。

标签: laravel


【解决方案1】:

实际上Illuminate\Database\Schema\Blueprint 类使用macroable trait

向类动态添加方法的特征。

以下是我们可以利用此功能的方法。

  1. 宏方法添加到service provider's boot() method(例如:AppServiceProvider

    use Illuminate\Database\Schema\Blueprint;
    Blueprint::macro('defaultNull', function(...$columns){
       foreach($columns as $column) {
           $column->nullable();
       }
    });
    
  2. 在迁移类中使用我们的宏方法:现在您可以将所有“nullable”列添加到defaultNull 宏方法中,如下所示:

    Schema::create('my_table', function (Blueprint $table) {
        $table->increments('id');
        $table->defaultNull(
            $table->string('col_1'), 
            $table->string('col_2'), 
            $table->string('col_3')
        );
    });
    

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 2021-08-24
    • 2012-12-10
    • 2018-04-04
    • 2016-01-07
    • 2014-04-13
    • 2017-06-11
    • 2021-03-20
    • 2023-03-19
    相关资源
    最近更新 更多