Laravel中updateOrCreate结合increment()更新库存报错求助
问题原因
你遇到的错误核心是:执行updateOrCreate创建新记录时,只传入了marketing_id和product_id,但数据库的stock字段没有设置默认值,此时插入操作先于increment执行,导致数据库因为stock字段为空报错。
解决方案
这里提供三种可行的解决方式:
方式一:在updateOrCreate中初始化stock值
修改代码,在创建新记录时直接给stock设置初始值0,之后再执行增量操作:
\App\Models\MarketingStock::updateOrCreate( ['marketing_id' => $attr['marketing_id']], ['product_id' => $attr['product_id'], 'stock' => 0], )->increment('stock', $attr['qty']);
方式二:修改数据库表结构,给stock设默认值
在对应的数据库迁移文件中,给stock字段添加默认值0:
$table->integer('stock')->default(0);
然后执行迁移命令更新表结构:
php artisan migrate
注意:如果是已存在的表,需要创建新的迁移文件来修改字段,不要直接修改旧迁移文件后执行migrate:refresh(会清空数据)。
方式三:用firstOrNew手动处理创建逻辑
先查询记录是否存在,不存在则手动初始化stock再保存,最后执行增量:
$marketingStock = \App\Models\MarketingStock::firstOrNew( ['marketing_id' => $attr['marketing_id']], ['product_id' => $attr['product_id']] ); if (!$marketingStock->exists) { $marketingStock->stock = 0; $marketingStock->save(); } $marketingStock->increment('stock', $attr['qty']);
内容的提问来源于stack exchange,提问作者owf
相关产品推荐
相关产品推荐

