Вставить данные в laravel IDENTITY_INSERT установлен на OFF - PullRequest
0 голосов
/ 12 июня 2019

Так что у меня возникла проблема, когда я вставляю данные в базу данных 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] [Драйвер ODBC 11 для SQL Server] [SQL Server] Невозможно вставить явное значение для столбца идентификации в «статьях» таблицы, если для параметра IDENTITY_INSERT установлено значение OFF.

1 Ответ

1 голос
/ 12 июня 2019

Вы можете использовать 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');

...