如何在MySQL上正确地将Laravel与SQL Server结合使用?

Jun*_*ior 5 php sql-server laravel laravel-5.1

我正在尝试将Laravel项目的数据库使用SQL Server。我能够将SQL Server与Laravel 5.2连接。但是,当我尝试将数据植入表中时,出现此错误

[Illuminate\Database\QueryException] SQLSTATE[23000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cann ot insert explicit value for identity column in table 'surveys' when IDENTITY_INSERT is set to OFF. (SQL: insert into [surveys] ([id], [name]) values (10, 'Some Text'))
Run Code Online (Sandbox Code Playgroud)

注意:我正在尝试提供标识值,这可能是导致问题的原因。

在研究SQL错误时,我了解到我需要执行以下查询。

在播种之前,我需要执行

SET IDENTITY_INSERT surveys ON;
Run Code Online (Sandbox Code Playgroud)

播种后,我需要执行

SET IDENTITY_INSERT surveys OFF;
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何使用Laravel执行这些命令

在没有出现此问题的情况下,如何在为身份列提供值时播种?

更新这是我的播种机

<?php

use Illuminate\Database\Seeder;

class FinalSurveyTS extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {   
        $myTable = 'surveys';

        DB::statement('SET IDENTITY_INSERT ' . $myTable . ' ON');


        DB::table($myTable)->truncate();


        DB::table($myTable)->insert([
            'id' => 10,
            'name' => 'some name',
        ]);

        DB::statement('SET IDENTITY_INSERT ' . $myTable . ' OFF');
    }
}
Run Code Online (Sandbox Code Playgroud)

Lau*_*nce 5

对于任何通过Google找到的人-新的正确答案是这样使用unprepared()

DB::beginTransaction();
DB::unprepared('SET IDENTITY_INSERT test ON');
DB::table('test')->insert(['id' => 1, 'name' => 'example']);
DB::unprepared('SET IDENTITY_INSERT test OFF');
DB::commit();
Run Code Online (Sandbox Code Playgroud)

正如在此问题线程上讨论的那样:https : //github.com/laravel/framework/issues/27778


Ser*_*lla 3

为了执行这些命令,您可以将其作为原始命令

DB::statement('SET IDENTITY_INSERT surveys ON;');
Run Code Online (Sandbox Code Playgroud)

进而

DB::statement('SET IDENTITY_INSERT surveys OFF;');
Run Code Online (Sandbox Code Playgroud)

DB::statement 适用于不返回数据的命令

编辑 当播种器像这样执行时:

DB::statement(...);
DB::table(...)->insert(...);
DB::statement(...);
Run Code Online (Sandbox Code Playgroud)

似乎由于某种原因,IDENTITY_INSERT 变量的状态没有保留,因此使其工作的一种方法是将代码包装在事务中。

try {
    DB::beginTransaction();
    DB::statement(...);
    DB::table(...)->insert(...);
    DB::statement(...);
    DB::commit();
} catch(Exception $e) {
    DB::rollback();
}
Run Code Online (Sandbox Code Playgroud)