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

