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
相关产品推荐
相关产品推荐

