在 SQL Server 中,可以构建包括列的索引,如下所示:
CREATE UNIQUE INDEX ix_cust_email_inc
ON sales.customers(email)
INCLUDE(first_name,last_name);
可以在 Laravel 上的迁移中做类似的事情吗?
目前,我可以创建这样的索引,正如您所见,它没有
INCLUDE
功能:
$table->index(['email']);
Laravel 8.x 的答案是可以,但不能使用任何 Laravel 工具。您只需将代码作为原始 sqlserver 查询运行即可。
代码应该如下所示:
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Migrations\Migration;
class MyMigration extends Migration{
public function up(){
if(config('database.default')=="sqlsrv"){
DB::statement("CREATE INDEX index_name ON table_name (column_name_1,column_name_1) INCLUDE (column_name_3, column_name_4);");
}
}
}
这是laravel的索引用法https://laravel.com/docs/8.x/migrations#creating-indexes,这里是执行原始sql代码的方法https://laravel.com/docs/ 8.x/database#running-queries
您可以为此创建宏:
protected function indexWithInclude(): callable
{
return function (array $columns, array $includeColumns, string $name = null) {
$index = implode(', ', $columns) . ') INCLUDE (' . implode(', ', $includeColumns);
/** @var Blueprint $this */
return $this->rawIndex($index, $name);
};
}
启用宏:
Blueprint::mixin(new MacrosMigration());
用途:
$table->indexWithInclude(['columns array'], ['include columns array'], 'index name');