扩展模式生成器

11 浏览
0 Comments

扩展模式生成器

是否有人能够详细指导我如何扩展Illuminate\\Database\\Schema,以添加一个zerofill函数并修改当前的integer函数以接受一个长度参数,同时又不修改任何供应商文件。非常感谢。\n编辑:或者是否有一种通过Schema Builder手动添加列的方法,只是因为我当前头脑不太清楚?\n编辑:我采用了Gareth Oakley建议的方法,在Schema::create()之后添加了一个DB::statement()调用:\n

engine = 'InnoDB';
                $table->increments('id')->unsigned();
                $table->integer('account_id')->unsigned();
                $table->string('card_id', 20)->nullable();
                $table->boolean('active')->default(true);
                $table->timestamps();
                $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade')->onUpdate('cascade');
            });
            DB::statement('ALTER TABLE examples ADD invoice_id INT(6) UNSIGNED ZEROFILL NOT NULL AFTER card_id');
        }
        public function down()
        {
            Schema::drop('examples');
        }
    }

0
0 Comments

问题的出现原因:

这个问题的出现是因为在Laravel的Schema Builder中没有提供直接创建zerofills列的方法。

解决方法:

要解决这个问题,可以使用DB类的statement方法手动创建zerofills列。具体的解决方法如下所示:

DB::statement('ALTER TABLE MyTable ADD MyColumn INT UNSIGNED ZEROFILL NOT NULL');

在Laravel的Schema Builder中,通常可以很方便地创建和修改数据库表结构。然而,有时候我们可能需要使用一些特定于数据库的功能,比如zerofills。zerofills功能可以在列中使用ZEROFILL属性来替换默认的空格填充为零。例如,对于一个声明为INT(4) ZEROFILL的列,取值为5将被检索为0005。

然而,Laravel的Schema Builder并没有提供直接创建zerofills列的方法。所以,要使用zerofills功能,我们需要手动创建列。一种解决方法是使用DB类的statement方法来执行原生的SQL语句。通过执行ALTER TABLE语句,我们可以向MyTable表中添加一个名为MyColumn的INT UNSIGNED ZEROFILL列,并设置为NOT NULL。

虽然这不是我真正想要做的事情,但这仍然是最简单和最常见的实现方法,非常感谢。如果你想了解更多关于在Laravel迁移中使列不可为空的问题,可以参考这个链接:Make column not nullable in a Laravel migration

0