我的模型是这样的:
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();
有人知道为什么吗?
答案 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();
});