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

在Laravel PHP中使用updateOrInsert后如何获取数据表的主键ID?

问题原因

Laravel 中 DB 门面提供的 updateOrInsert 方法返回值为布尔类型,仅代表操作是否成功,不会返回对应操作记录的主键,所以你当前写法中 $coin 变量无法直接获取到 coin_id。

解决方案

方案一:使用 Eloquent 模型实现(推荐)

Eloquent 提供的 updateOrCreate 方法会返回对应操作的模型实例,可以直接获取主键,代码改动最小。

  1. 首先确保你已经创建了 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'];
}
  1. 业务代码修改为:
// 操作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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:18:01