所以当我在数据库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时,无法在表“文章”中为标识列插入显式值。
答案 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');