使用Laravel在SQL Server中添加varchar列类型

时间:2019-01-26 08:31:52

标签: laravel laravel-5.7 nvarchar laravel-migrations laravel-schema-builder

我正在将Laravel 5.7与SQL Server 2017一起使用,我想生成一个名为varchar(50)的{​​{1}}列。

执行此代码反而给了我name

nvarchar(50)

如何区分创建Schema::create('test', function(Blueprint $table) { $table->string('name', 50); }); varchar字段?

1 个答案:

答案 0 :(得分:3)

这是一个黑暗的镜头,因为我没有要测试的SQL Server。但是基本上,您可以扩展BlueprintSqlServerGrammar类并添加自己的列类型。请测试并让我知道。 :)

在该文件夹内创建一个名为Schemas的文件夹,分别创建文件夹BlueprintsGrammars。在其中,创建您的PHP类:

Schemas file structure

CustomBlueprint.php

<?php

namespace App\Schemas\Blueprints;

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Schema\Builder;

class CustomBlueprint extends Blueprint
{
    public function varChar($column, $length = null)
    {
        $length = $length ? : Builder::$defaultStringLength;

        return $this->addColumn('varChar', $column, compact('length'));
    }
}

CustomGrammar.php

<?php

namespace App\Schemas\Grammars;

use Illuminate\Database\Schema\Grammars\SqlServerGrammar;
use Illuminate\Support\Fluent;

class CustomGrammar extends SqlServerGrammar
{
    protected function typeVarChar(Fluent $column)
    {
        return "varchar({$column->length})";
    }
}

您的迁移文件:

public function up()
{
    DB::connection()->setSchemaGrammar(new CustomGrammar());
    $schema = DB::connection()->getSchemaBuilder();

    $schema->blueprintResolver(function($table, $callback) {
        return new CustomBlueprint($table, $callback);
    });

    $schema->create('test', function (CustomBlueprint $table) {
        $table->string('name', 50); // <-- nvarchar(50)
        // or
        $table->varChar('name', 50); // <-- varchar(50)
    });
}