Laravel5.6调用delete()报Call to a member function delete() on null错误排查
Call to a member function delete() on null错误 嘿,咱们来捋捋你碰到的这个问题:你已经确认$id输出是正确的"1",但Category::find($id)却返回null,导致调用delete()时报错。这事儿大概率是这几个原因,咱们一个个排查:
可能的原因&对应的解决办法
1. 数据库里压根没这条记录
先直接去你的数据库里查categories表(默认Laravel会把Category模型对应到这个表),看看有没有id=1的记录:
SELECT * FROM categories WHERE id = 1;
要是查不到,那问题就明摆着了——你想删的记录根本不存在,find()自然返回null,调用delete()肯定报错。
2. 模型绑定的表名不对
检查下你的Category模型,是不是指定了正确的表名?默认Laravel会把模型名复数化作为表名,比如Category对应categories,但如果你手动改了表名,或者模型里没明确指定,就会找不到数据:
// 在Category模型里确认这行代码 protected $table = 'categories'; // 确保这个是你实际使用的表名
3. 用findOrFail()替代find(),提前处理异常
不管是记录不存在还是其他小问题,用findOrFail()会直接抛出404异常,既避免了调用delete()时的错误,也能明确告诉用户“这条记录找不到”:
public function destroy($id) { Category::findOrFail($id)->delete(); return redirect()->back(); }
4. 试试路由模型绑定,代码更简洁
如果你的路由是这么定义的:
Route::delete('/categories/{category}', [CategoryController::class, 'destroy']);
可以直接用路由模型绑定,让Laravel自动帮你查找Category实例,找不到就返回404,代码也更清爽:
public function destroy(Category $category) { $category->delete(); return redirect()->back(); }
这种方式还能省掉手动处理$id的步骤,符合Laravel的最佳实践哦。
5. 确认模型的主键是不是id
如果你的categories表主键不是默认的id,而是别的字段(比如category_id),那find()方法会默认去匹配id字段,自然找不到记录。这时候要在模型里指定主键:
// 在Category模型中添加这行 protected $primaryKey = 'category_id';
总结
最常见的情况就是要删除的记录不存在,或者模型和数据库表的映射出了问题。先去数据库查对应ID的记录,再检查模型的表名、主键配置,最后用findOrFail()或者路由模型绑定来优化代码,就能避免这类错误啦。
内容的提问来源于stack exchange,提问作者Ashar Khan

