You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:51:18