Laravel中find()->delete()报BadMethodCallException,where删正常如何解决?
Laravel 调用find()->delete()报ondeletemodel方法未定义问题分析与修复
错误原因
两种删除写法的底层逻辑差异直接导致了运行结果不同:
Task::find($id)->delete():先查询得到Task模型实例,再调用模型层面的delete方法,会触发模型的deleting事件。你自定义的UseUuidTrait中注册了deleting事件回调,回调中调用了$model->ondeletemodel($model),但你的Task模型中没有定义ondeletemodel方法,因此抛出方法未定义异常。Task::where('id', $id)->delete():属于查询构造器层面的批量删除操作,不会触发任何模型事件,因此deleting回调不会执行,不会调用不存在的方法,所以运行正常。
解决方案
可根据你的业务需求选择以下任意一种方案:
- 给Task模型补充
ondeletemodel方法,实现删除前的自定义业务逻辑
// 追加到App\Models\Task类中 public function ondeletemodel($model) { // 此处编写你需要的删除前逻辑,例如关联数据清理、操作日志记录等 }
- 若不需要
ondeletemodel相关逻辑,直接删除UseUuidTrait中的deleting事件注册代码即可
// 删除UseUuid Trait中的以下代码 static::deleting(function ($model) { $model->ondeletemodel($model); });
- 若不需要触发模型删除事件,可统一使用查询构造器的where条件删除写法,注意该写法不会执行任何模型删除相关的事件回调。
- 若所有使用
UseUuidTrait的模型都需要相同的ondeletemodel逻辑,可直接将该方法实现放在Trait中,无需每个模型单独定义
// 追加到UseUuid Trait中 public function ondeletemodel($model) { // 统一编写通用的删除前逻辑 }
内容的提问来源于stack exchange,提问作者Junior Frogie
相关产品推荐
相关产品推荐

