将Laravel IDENTITY_INSERT中的插入数据设置为OFF

时间:2019-06-12 10:58:50

标签: laravel sqlsrv

所以当我在数据库sqlserver上插入数据时遇到了问题。 id sqlserver拒绝插入,因为数据库要自己插入id。

我必须尝试将IDENTITY_INSERT设置为ON:

DB::statement('SET IDENTITY_INSERT articles ON;');

,然后将IDENTITY_INSERT设置为OFF:

DB::statement('SET IDENTITY_INSERT articles OFF;');

但不适用于我的代码。

   public function store(Request $request){
        //to sparate to methode
        $article = $request->isMethod('put') ? Article::findOrFail($request->article_id) : new Article;

        $article->id = $request->input('article_id');
        $article->title = $request->input('title');
        $article->body = $request->input('body');

        DB::statement('SET IDENTITY_INSERT articles ON;');
        if($article->save()){
            return new ArticleResources($article);
        }
        DB::statement('SET IDENTITY_INSERT articles OFF;');

    }

此错误如下所示:

  

SQLSTATE [23000]:[Microsoft] [用于SQL Server的ODBC驱动程序11] [SQL Server]当IDENTITY_INSERT设置为OFF时,无法在表“文章”中为标识列插入显式值。

1 个答案:

答案 0 :(得分:1)

您可以使用DB::unprepared()代替DB::statement()

区别在于statement()执行一条准备好的语句,而unprepared()则使用PDO::exec()

每个准备好的语句都会启动一个新会话(在同一数据库连接内),并且由于SET IDENTITY_INSERT查询是特定于会话的,因此它不会影响其他准备好的语句,例如INSERT查询。

PDO::exec()影响整个数据库连接。

赞:

DB::unprepared('SET IDENTITY_INSERT test_table ON');
DB::table('articles')->insert(['id' => $request->input('article_id'), 'title' => $request->input('title'), 'body'=> $request->input('body')]);
DB::unprepared('SET IDENTITY_INSERT test_table OFF');