Laravel插入数据遇user_id无默认值报错的问题问询
解决SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value 错误
你遇到的这个数据库插入错误,核心原因是stocks表的user_id字段没有获取到有效值,同时该字段在数据库中既无默认值也不允许为空。咱们来一步步排查并解决问题:
问题定位
先看代码里的两个关键问题:
- 控制器的字段引用错误:你在
StockController的store方法里写了'user_id' => Auth::user()->user_id,但默认Laravel的User模型主键是id,不是user_id,这会导致获取不到正确的用户ID值。 - 前端冗余且不安全的输入框:你在表单里加了
name="user_id"的输入框,其实完全没必要通过前端传递用户ID——后端直接通过Auth::user()获取既安全又可靠,还能避免前端篡改数据的风险。
具体修复方案
1. 修正StockController的store方法
把错误的字段引用改成正确的,同时可以去掉user_id的表单验证(因为我们不再从前端获取这个值):
public function store(Request $request) { $this->validate($request, [ // 移除user_id的验证规则,改为后端直接获取 'product_name' => 'required', 'product_code' => 'required', 'details' => 'required', 'price' => 'required', 'cost' => 'required', 'quntity' => 'required' ]); $stock = new Stock([ 'user_id' => Auth::user()->id, // 修正为正确的主键字段 'product_name' => $request->get('product_name'), 'product_code' => $request->get('product_code'), 'details' => $request->get('details'), 'price' => $request->get('price'), 'cost' => $request->get('cost'), 'quntity' => $request->get('quntity') ]); $stock->save(); return redirect()->route('stock.index')->with('success', 'Data Added'); }
2. 清理视图中的冗余代码
从create视图里删掉这个多余的输入框:
<input type="text" name="user_id" value="{{Auth::user()->id }}" class="form-control">
可选:检查User模型主键(如果你的数据库特殊配置)
如果你的User表确实用user_id作为主键,需要在User模型里明确声明:
class User extends Authenticatable { protected $primaryKey = 'user_id'; // 其他模型代码... }
不过默认Laravel用的都是id作为主键,所以这个步骤大概率不需要。
修复逻辑说明
- 后端直接通过
Auth::user()->id获取当前登录用户ID,既保证了数据的正确性,又避免了前端传递可能带来的安全风险。 - 修正控制器的字段引用后,
user_id会被正确赋值并插入数据库,彻底解决"没有默认值"的错误。
这样修改后,你再提交表单应该就能正常添加库存数据了~
内容的提问来源于stack exchange,提问作者user12033292
相关产品推荐
相关产品推荐

