Laravel 9中find()与delete()方法失效问题排查求助
Laravel 9中find()和delete()方法失效的问题排查
核心问题:模型主键属性名写错
你的Users模型中,主键属性名拼写错误。Laravel模型规定主键属性为**$primaryKey**(驼峰命名,K大写),但你写成了$primarykey(k小写),导致Laravel无法识别自定义主键userid,默认使用id字段进行查询/操作,这是所有问题的根源。
分方法解释失效原因
1. find()方法失效
find()方法默认使用模型定义的主键字段查询数据。因为主键属性写错,Laravel会用默认的id字段而非userid执行查询,所以Users::find($id)实际是查找id = $id的记录,自然无法匹配到数据。而where('userid', '=', $id)->get()是明确指定字段查询,所以能正常工作。
2. delete()方法失效
- 你用
where('userid', '=', $id)->get()获取的是集合(Collection),不是单个模型实例,集合没有delete()方法,调用$user->delete()不会执行删除操作; - 即使你拿到单个模型实例,因主键属性写错,模型也无法正确识别主键值,无法执行删除逻辑。
修正方案
第一步:修正Users模型
class Users extends Model { use HasFactory; protected $table = 'users'; // 修正主键属性名,K大写 protected $primaryKey = 'userid'; // 可选:如果userid不是自增整数类型,添加以下配置 // public $incrementing = false; // 可选:如果userid是字符串类型,添加以下配置 // protected $keyType = 'string'; }
第二步:修正find()方法代码
// 现在find()会自动使用userid字段查询 $user = Users::find($id); return redirect('/register/view');
第三步:修正delete()方法代码
推荐使用模型实例删除(更符合Laravel Eloquent规范):
$user = Users::find($id); if ($user) { $user->delete(); } return redirect('/register/view');
或者用查询构造器简化删除(无需判断是否存在,无匹配记录时不会执行删除):
Users::where('userid', $id)->delete(); return redirect('/register/view');
如果要通过where查询后删除单个实例,需用first()获取单个模型(而非get()返回集合):
$user = Users::where('userid', $id)->first(); if ($user) { $user->delete(); } return redirect('/register/view');
内容的提问来源于stack exchange,提问作者Huzaifa Ahmed
相关产品推荐
相关产品推荐

