无法使用查询生成器软删除多行

时间:2015-03-30 15:37:07

标签: laravel-5

我的模型是这样的:

namespace App;
use Illuminate\Database\Eloquent\SoftDeletes;

class Photo extends Model {
    use SoftDeletes;
    protected $dates = ['deleted_at'];
}

_我可以使用以下方式进行软删除:

$\App\Photo::find(1)->delete();

_当我尝试在多行上使用软删除时,它不起作用:

\App\Photo::whereIn('id', [1,2,3])->delete();

有人知道为什么吗?

2 个答案:

答案 0 :(得分:1)

软删除功能仅适用于Eloquent模型本身的实例。当你这样做时:

\App\Photo::find(1)->delete();

您实际上是首先从数据库中检索ID为1的Photo,然后将其作为Eloquent模型的实例(可以使用软删除)提供。

但是,当你这样做时:

\App\Photo::whereIn('id', [1,2,3])->delete();

您实际上并没有从数据库中检索任何内容,您基本上只是以更方便的方式准备DELETE SQL。这有效地运行如下:

DELETE FROM `photos` WHERE `id` IN (1,2,3);

这与以下内容不同:

foreach (\App\Photo::whereIn('id', [1,2,3])->get() as $photo) {

    $photo->delete();  # $photo is an eloquent model and can soft-delete

}

注意 - > get(),它实际上是首先从数据库中获取数据,并将其作为Eloquent模型的集合提供(然后可以软件删除)。

我认为您不能软删除批次。在我的foreach示例中使用 - > get()我想象会执行多个查询 - 类似于:

UPDATE `photos` SET `deleted_at` = NOW() WHERE `id` = 1;
UPDATE `photos` SET `deleted_at` = NOW() WHERE `id` = 2;
UPDATE `photos` SET `deleted_at` = NOW() WHERE `id` = 3;

希望这是有道理的。

答案 1 :(得分:0)

试试这个:

\App\Photo::whereIn('id', [1,2,3])
    ->get()
    ->map(function($photo) {
        $photo->delete();
    });