在 laravel 5 问题中使用软删除

Using soft delete in laravel 5 issue

这是我的模型:

namespace App\Models\Admin;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Image extends Model
{
    use SoftDeletes;
    //table
    protected $table = 'images';
}

如果我添加我的特征,如果我这样使用我的模型,我找不到任何记录:

$imageFile = ImageModel::where('id', 12)->first();

$imageFile 始终是 null,如果我删除我的特征是有效的。为什么???

根据您所说的,它正在按预期工作。当您在 Laravel 中使用软删除特性时,模型不会从数据库中删除。当您将模型传递给 destroy() 时,唯一发生的事情是 deleted_at 字段变为非空。

如果您深入研究 Laravel 的代码,当您调用

ImageModel::where('id', 12)->first(); 

正在添加软删除特性

where null

到 deleted_at 列的 SQL。这意味着,正如您所说,如果您关闭该特征, $imageFile 将不会为空(它正在工作)。因为软删除从未从数据库中删除模型 - 它只是为该模型向数据库添加了一个非空值,因此对普通 laravel 查询可见:当您不使用软删除时,Laravel 不关心 deleted_at 字段,所以它会看到模型。当您打开软删除时,它只查找空值,并且因为您的模型被软删除(它具有非空值),所以它 returns $imageFile as null.

正如 bytewave 所说,要正确使用软删除而不是 return $imageFile 的空值,您需要将软删除模型添加到您的查询中,如下所示:

Image::withTrashed()->where('id', 12')->first();

我认为您正在寻找稍微不同的功能(回滚),这与 softdelete 特征的意图略有不同。手册非常好:5.4 soft-deletes,但深入了解特征代码也可能有所帮助。

也看看 ->restore() 函数 - 这可能会帮助您更接近您正在寻找的预期回滚。但是,您需要先了解哪些逻辑被删除了。