使用 Laravel 在 SQL Server 中添加 varchar 列类型
Posted
技术标签:
【中文标题】使用 Laravel 在 SQL Server 中添加 varchar 列类型【英文标题】:Add varchar column type with SQL Server using Laravel 【发布时间】:2019-06-19 23:18:12 【问题描述】:我正在使用 Laravel 5.7 和 SQL Server 2017,我想生成一个名为 name
的 varchar(50)
列。
执行此代码会给我一个nvarchar(50)
:
Schema::create('test', function(Blueprint $table)
$table->string('name', 50);
);
如何区分创建varchar
或nvarchar
字段?
【问题讨论】:
我刚刚查看了代码,乍一看似乎没有简单的方法可以做到这一点,但是,我确实找到了这个答案,可能是有帮助的***.com/questions/41068951/…。本质上,要自己动手,您必须重写一些安静的 DB 类,以允许使用自定义SqlServerGrammar
类。
更新了我的答案,请测试并告诉我们。如果它不起作用,我将删除答案并等待更好的答案。 :)
【参考方案1】:
这是在黑暗中拍摄的,因为我没有要测试的 SQL Server。但基本上你可以扩展Blueprint
和SqlServerGrammar
类并添加你自己的列类型。请测试并告诉我。 :)
在app
文件夹下创建一个名为Schemas
的文件夹,然后在Schemas
文件夹下创建文件夹Blueprints
和Grammars
。在其中创建您的 php 类:
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)
);
【讨论】:
以上是关于使用 Laravel 在 SQL Server 中添加 varchar 列类型的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP Laravel 中的 SQL Server 中将字符串转换为日期数据类型
使用laravel从sql server生成UUID数据类型(uniqueidentifier)失败
在 Laravel 5.3 中从 SQL Server 获取多个结果集
Laravel 8:调用 DB::unprepared($sql) 时出现 ErrorException::("PDO::exec(): MySQL server has gone away