Laravel连接SQL Server时,如何获取INSERT的OUTPUT子句返回值?
解决Laravel连接SQL Server时获取INSERT生成的UniqueIdentifier问题
我之前也遇到过Laravel搭配SQL Server时,无法获取数据库端生成的uniqueidentifier的问题,你的情况很典型——直接用DB::insert只会返回受影响行数,而Eloquent默认也不会自动同步数据库生成的非自增主键。下面给你几个可行的解决方案:
方案一:直接使用PDO执行带OUTPUT的语句
既然原生SQL的INSERT...OUTPUT能正常返回结果,我们可以绕过Laravel的DB::insert封装,直接用PDO执行查询并获取返回值:
// 构造带OUTPUT子句的插入语句 $insertQuery = "INSERT INTO MyModelBase (field1, field2, etc) OUTPUT INSERTED.MyModelId VALUES (?, ?, ?)"; // 准备对应参数(和你的$information数组字段匹配) $params = [ $information['field1'], $information['field2'], $information['etc'] ]; // 获取PDO实例并执行查询 $pdo = DB::getPdo(); $stmt = $pdo->prepare($insertQuery); $stmt->execute($params); // 直接获取返回的uniqueidentifier值 $insertedId = $stmt->fetchColumn(); echo "inserted id is " . $insertedId;
这个方法直接利用PDO的fetchColumn获取OUTPUT返回的字段,完全避开了Laravel封装层的限制。
方案二:修复Eloquent模型的主键同步问题
你的模型配置看起来基本正确,但Eloquent默认不会自动从数据库拉取数据库端生成的非自增主键,所以create后直接访问MyModelId会是空值。只需要在创建后调用refresh()方法,让模型从数据库重新同步数据即可:
$inserted = MyModel::create($information); // 刷新模型,同步数据库生成的主键数据 $inserted->refresh(); echo "inserted id is " . $inserted->MyModelId;
另外要确认你的$fillable数组包含了所有需要插入的字段,避免因为批量赋值限制导致插入失败或字段缺失。
关于你的替代方案的风险
你提到的通过CreatedOn字段获取最新行的方法,在高并发场景下非常不可靠——如果同时有多个请求插入数据,你很可能拿到其他请求创建的行,导致数据混乱,所以强烈建议使用上面两种方案。
内容的提问来源于stack exchange,提问作者Vulgar Coder
相关产品推荐
相关产品推荐

