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

问题描述 投票:0回答:2

我正在使用 Laravel 5.7 和 SQL Server 2017,我想生成一个名为

varchar(50)
name
列。

执行这段代码会给我一个

nvarchar(50)

Schema::create('test', function(Blueprint $table) {
    $table->string('name', 50);
});

如何区分创建

varchar
nvarchar
字段?

laravel laravel-5.7 nvarchar laravel-migrations laravel-schema-builder
2个回答
8
投票

这是一个盲目的尝试,因为我没有 SQL Server 来测试。但基本上您可以扩展

Blueprint
SqlServerGrammar
类并添加您自己的列类型。请测试并告诉我。 :)

Schemas
文件夹下创建一个名为
app
的文件夹,然后在
Blueprints
文件夹下创建文件夹
Grammars
Schemas
。在其中创建您的 PHP 类:

自定义蓝图.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'));
    }
}

自定义语法.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)
    });
}

0
投票

string
方法创建一个给定长度的
VARCHAR
等效列:

// Syntax : 
$table->string('column_name', length: 100); 

//In use:
$table->string('post_title', 50); 
© www.soinside.com 2019 - 2024. All rights reserved.