Laravel:删除除最新5个以外的所有内容

4

我试图让这个查询起作用:

$deleteSubmissions = ViewedSubmission::where('user_id', Auth::user()->id)
    ->latest()
    ->skip(5)
    ->delete();

我希望删除掉所有认证用户的ViewedSubmissions记录,除了最新的5条。如何实现这个功能?目前尽管有超过5条记录,但是什么都没有被删除。


你能说明一下 latest() 的作用吗?我猜它是一个范围 - 它是按 created_at 排序的吗? - ceejayoz
最新和最旧的方法允许您轻松按日期对结果进行排序。默认情况下,结果将按照created_at列进行排序。 - Felix
2个回答

7
我会这样处理:
$keep = ViewedSubmission::where('user_id', Auth::user()->id)
    ->latest()
    ->take(5)
    ->pluck('id');

ViewedSubmission::where('user_id', Auth::user()->id)
    ->whereNotIn('id', $keep)
    ->delete();

这与我原本的做法类似,但我希望将其简化为单个->delete()查询,以最小化总数据库查询次数。难道没有更简单的方法吗? - Felix
@FelixMaxime 如果正确索引,这两个查询应该几乎不需要时间。 - ceejayoz

3
编辑:可以选择除给定数组外的最新5条记录,然后删除。
$except = 5;
ViewedSubmission::where('user_id', Auth::user()->id)
    ->latest()
    ->skip($except)
    ->get()
    ->each(function($row){ $row->delete(); });

如果你有一个与用户ID相关的关系(一对多),例如名为 viewedSubmissions ,可以这样做:

$except = 5;
Auth::user()->viewedSubmissions()
    ->latest()
    ->skip($except)
    ->get()
    ->each(function($row){ $row->delete(); });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接