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

Laravel 5.6操作PostgreSQL 10插入后如何获取自增test_id

解决Laravel 5.6插入PostgreSQL 10后获取identity列ID的问题

你遇到的问题很典型:Laravel的insert()方法返回的是操作是否成功的状态值(你看到的1其实是布尔值true的整数表现形式),并不会返回RETURNING子句的结果,这就是为什么不管插入多少条数据,拿到的都是1的原因。

下面给你几个可行的解决方案,按推荐程度排序:

方案一:使用Laravel内置的insertGetId()方法(最推荐)

这个方法是Laravel专门为插入后获取自增/identity列ID设计的,对PostgreSQL的兼容性很好,它会自动帮你处理RETURNING逻辑:

$test_id = \DB::connection('pgsql')->table('test')->insertGetId(
    ['test_name' => 'hello world']
);

执行后$test_id就是刚插入数据的test_id值,完全符合你的需求。

方案二:用select()方法执行带RETURNING的原生SQL

如果你更倾向于写原生SQL,可以用select()代替insert(),因为select()会返回查询结果集:

// 执行插入并返回包含test_id的结果
$result = \DB::connection('pgsql')->select(
    'INSERT INTO test (test_name) VALUES (?) RETURNING test_id',
    ['hello world']
);
// 从结果集中取出test_id
$test_id = $result[0]->test_id;

这里select()执行插入语句后,会返回一个包含对象的数组,第一个对象的test_id属性就是你要的ID。

方案三:使用Eloquent模型(更优雅的Laravel风格)

如果你的项目用了Eloquent模型,这会是最优雅的方式。首先创建对应test表的模型(比如Test.php),记得设置主键:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    protected $table = 'test';
    protected $primaryKey = 'test_id'; // 指定主键字段
    public $timestamps = false; // 如果你的表没有created_at/updated_at字段,需要加上这个
}

然后通过模型保存并获取ID:

$test = new Test();
$test->test_name = 'hello world';
$test->save();

$test_id = $test->test_id; // 直接获取刚插入的ID

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:58