You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:33:21