在Laravel PHP中使用updateOrInsert后如何获取数据表的主键ID?
问题原因
Laravel 中 DB 门面提供的 updateOrInsert 方法返回值为布尔类型,仅代表操作是否成功,不会返回对应操作记录的主键,所以你当前写法中 $coin 变量无法直接获取到 coin_id。
解决方案
方案一:使用 Eloquent 模型实现(推荐)
Eloquent 提供的 updateOrCreate 方法会返回对应操作的模型实例,可以直接获取主键,代码改动最小。
- 首先确保你已经创建了
Coin模型,并且在模型的$fillable属性中添加允许批量赋值的字段:
// app/Models/Coin.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Coin extends Model { protected $fillable = ['name', 'symbol', 'image', 'circulated_supply', 'max_supply']; }
- 业务代码修改为:
// 操作coins表,返回模型实例 $coin = \App\Models\Coin::updateOrCreate( ['name' => "ethereum", 'symbol' => "dsafd", 'image' => "adfadsfasdfasdfasdfd"], ['circulated_supply' => "123123", 'max_supply' => "123123"] ); // 直接从模型实例获取主键id,插入coin_prices表 DB::table('coin_prices')->insert([ 'coin_id' => $coin->id, 'price_change' => '你需要填充的数值' ]);
方案二:保留DB门面写法,拆分操作逻辑
如果不想引入Eloquent模型,可以把更新/插入逻辑拆分,分别处理两种场景拿主键:
$condition = [ 'name' => "ethereum", 'symbol' => "dsafd", 'image' => "adfadsfasdfasdfasdfd" ]; $updateData = [ 'circulated_supply' => "123123", 'max_supply' => "123123" ]; // 先查询是否存在对应记录 $existCoin = DB::table('coins')->where($condition)->first(); if ($existCoin) { // 记录存在则更新,直接拿已有id DB::table('coins')->where('id', $existCoin->id)->update($updateData); $coinId = $existCoin->id; } else { // 记录不存在则插入,用insertGetId获取新插入的主键 $coinId = DB::table('coins')->insertGetId(array_merge($condition, $updateData)); // 如果你的主键字段名不是id,是coin_id,这里要传第二个参数: // $coinId = DB::table('coins')->insertGetId(array_merge($condition, $updateData), 'coin_id'); } // 插入coin_prices表 DB::table('coin_prices')->insert([ 'coin_id' => $coinId, 'price_change' => '你需要填充的数值' ]);
内容的提问来源于stack exchange,提问作者thanks
相关产品推荐
相关产品推荐

