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

Laravel 5.8中如何获取新增Product记录的最后插入ID?

解决Laravel 5.8新增Product记录后无法获取ID的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是**create()方法的使用方式不对**,另外还有个模型里的拼写小错误,我一步步给你讲清楚:

1. 错误根源:create()是静态方法,你的调用没拿到返回实例

你现在的代码是:

$product = new Product();
$product->create([...]); // 这里错了!

create()是Laravel模型的静态方法,它会直接创建并保存新实例,然后返回这个实例。但你现在是先实例化了一个空的$product,再调用它的create(),这相当于用空实例调用静态方法,返回的新实例根本没赋值给$product变量,所以$product->id自然拿不到值。

2. 两种正确的写法

写法一:直接用静态create()并接收返回实例

$product = Product::create([
    'company_id' => $request->user()->company_id,
    'enable' => $request->input('enable') ?? 0,
    'id_delivery_vat' => $request->input('id_delivery_vat') ?? 1,
    'id_product_vat' => $request->input('id_product_vat') ?? 1,
    'id_producer' => $request->input('id_producer'),
    'promo' => $request->input('promo') ?? 0,
    'name' => $request->input('name'),
    'qr_code' => $request->input('qr_code'),
    'oe_code' => $request->input('oe_code'),
    'description' => $request->input('description'),
    'product_price' => str_replace(",", ".", $request->input('product_price')) ?? 0,
    'promo_product_price' => str_replace(",", ".", $request->input('promo_product_price')) ?? 0,
    'product_delivery_price' => str_replace(",", ".", $request->input('product_delivery_price')) ?? 0,
    'quantity' => $request->input('quantity'),
    'url_address' => Str::slug($request->input('name'), '-')
]);

// 现在直接拿ID就可以了
$newProductId = $product->id;

写法二:先实例化赋值,再save()

如果你更习惯分步操作,也可以这样写:

$product = new Product();
$product->company_id = $request->user()->company_id;
$product->enable = $request->input('enable') ?? 0;
// 依次给其他字段赋值...
$product->url_address = Str::slug($request->input('name'), '-');

// 保存到数据库
$product->save();

// 保存完成后就能获取ID
$newProductId = $product->id;

3. 额外修复:模型里的拼写错误

我注意到你的Product模型里写了protected $quarded = ['id'];,这里有个拼写错误!应该是$guarded,不是$quarded。虽然这个不是当前ID问题的直接原因,但会影响批量赋值的安全性,赶紧修正过来:

class Product extends Model {
    use scopeActiveTrait;
    protected $fillable = ['company_id', 'id_delivery_vat', 'id_product_vat', 'id_producer', 'name', 'qr_code', 'oe_code', 'enable', 'promo', 'description', 'product_price', 'promo_product_price', 'product_delivery_price', 'quantity', 'url_address'];
    protected $guarded = ['id']; // 修正拼写
    public $timestamps = true;
    
    // ...其他关联方法
}

为什么这样能解决?

你的迁移用了bigIncrements('id'),Laravel默认会把id识别为自增主键,只要你正确保存模型实例(不管是create()返回的还是save()后的实例),框架都会自动把数据库生成的ID填充到实例的id属性里,直接调用就能拿到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:49:59