【问题标题】:Laravel override delete() on whereIn is not WorkingLaravel 在 whereIn 上覆盖 delete() 不起作用
【发布时间】:2020-01-21 12:08:12
【问题描述】:

我正在制作一个可以(软)删除帖子的应用。它将删除数据库中的记录并删除存储中的图像文件,我尝试在我的模型中为delete() 创建一个覆盖方法,它看起来像这样

public function delete()
{
    $tempImage = $this->image;

    parent::delete();

    $this->imageDelete($tempImage);
}

public function imageDelete($image)
{
    $this->image = null;
    $this->save();

    if (! empty($image)) {
        unlink(public_path() . self::$pathImage . $image);
        unlink(public_path() . self::$pathThumb . $image);
    }
}

它适用于删除一条记录。但是,当我尝试删除多条记录时(使用whereIn),覆盖方法没有被访问,whereIn 正在访问真正的delete() 方法。

这是我删除帖子的控制器

public function delete(Request $r)
{
    Message::findOrFail($r->id)->delete();

    return redirect()->back();
}

public function multipleDelete(Request $r)
{
    Message::whereIn('id', $r->select)->delete();

    return redirect()->back();
}

如果我删除multipleDelete()的记录,它只会删除数据库中的记录。

【问题讨论】:

  • 为什么不使用 Message::destroy([1, 2, 3])。其中您可以在那里传递单个或多个 id。您有更长的逻辑来删除单个和多个消息。
  • 我需要删除每个id的图片

标签: laravel eloquent


【解决方案1】:

您覆盖的 delete() 实际上是 Eloquent 模型删除。但是,当您尝试在whereIn() 之后直接删除时,它是数据库查询。所以它根本不会通过你的模型。它正在使用原始 sql 删除数据。

您可以先将结果作为 Eloquent 模型检索,然后循环删除。

Message::whereIn('id', $r->select)->get()->each(function($msg) {
    $msg->delete();
});

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2018-01-21
    • 2018-11-25
    • 1970-01-01
    • 2010-12-03
    • 2012-07-28
    • 1970-01-01
    • 2021-11-13
    • 2018-02-13
    相关资源
    最近更新 更多