Laravel跳过和删除数据库中的记录



我正在开发一个应用程序,需要记录用户最近上传的视频列表。重要的是,它只需要记住与用户相关的最后两个视频,所以我试图找到一种方法,只保留最后两个记录在数据库中。

到目前为止,我得到的是下面,它正确地创建了一个新记录,但是我想删除所有比前2个更老的记录,所以我得到了下面。

问题是,这似乎删除了所有的记录,即使,根据我的理解,跳过应该错过最近的两个记录,

private function saveVideoToUserProfile($userId, $thumb ...)
{
RecentVideos::create([
'user_id'=>$userId,
'thumbnail'=>$thumb,
...
]);
RecentVideos::select('id')->where('user_id', $userId)->orderBy('created_at')->skip(2)->delete();
}

有人能看出我做错了什么吗?

Limitoffset不能使用delete,所以您可以这样做:

$ids = RecentVideos::select('id')->where('user_id', $userId)->orderByDesc('created_at')->skip(2)->take(10000)->pluck('id');
RecentVideos::whereIn('id', $ids)->delete();

首先,skip()不跳过x最近记录的数量,而是从结果集开始的x记录的数量。因此,为了得到想要的结果,需要按正确的顺序对数据进行排序。orderBy()默认为升序,但它接受第二个方向参数。试试orderBy('created_at', 'DESC')。(参见orderBy()的文档)

我建议这样写查询。

RecentVideos::where('user_id', $userId)->orderBy('created_at', 'DESC')->skip(2)->delete();

最新更新