如何在Eloquent删除操作中实现前置状态校验逻辑
Eloquent实现状态校验删除逻辑的正确方案
原代码存在的核心问题
- 状态查询未绑定传入的目标记录
$id,仅随机取表中第一条状态匹配的记录,校验逻辑和待删除目标完全脱节,会出现删错记录、校验失效的问题 - DB门面查询返回的是对象类型结果,直接和字符串做等值判断永远无法命中预期分支
- 未做目标记录存在性校验,传入不存在的ID时会触发空对象错误
- 用
LIKE模糊匹配状态值不符合精确校验需求,会误匹配包含目标关键词的其他状态值 - 模型调用未遵循大驼峰命名规范,小写
demande::destroy()容易触发类找不到错误
正确实现代码
首先确保控制器顶部引入对应Eloquent模型:
use App\Models\Demande;
destroy方法逻辑:
public function destroy($id) { // 按主键查询待操作的目标记录 $demande = Demande::find($id); // 记录不存在直接返回错误 if (!$demande) { return redirect('demandeur/demandes')->with('error', '申请记录不存在'); } // 精确校验目标记录状态 if ($demande->etat_demande !== 'En attente') { return redirect('demandeur/demandes')->with('error', 'La demande a deja été valider !'); } // 校验通过执行删除 $demande->delete(); return redirect('demandeur/demandes')->with('succes', 'Demande annuler !'); }
简化写法(可选)
如果不需要区分「记录不存在」和「状态不符合无法删除」的错误提示,可以直接通过条件过滤执行删除,减少一次查询:
public function destroy($id) { $deleteCount = Demande::where('id', $id) ->where('etat_demande', 'En attente') ->delete(); return $deleteCount ? redirect('demandeur/demandes')->with('succes', 'Demande annuler !') : redirect('demandeur/demandes')->with('error', 'La demande a deja été valider !'); }
注意:如果Demande模型开启了软删除功能,上述逻辑无需调整,
delete()方法会自动执行软删除操作。
内容的提问来源于stack exchange,提问作者Zen3x
相关产品推荐
相关产品推荐

