我正在开发一个应用程序,需要记录用户最近上传的视频列表。重要的是,它只需要记住与用户相关的最后两个视频,所以我试图找到一种方法,只保留最后两个记录在数据库中。
到目前为止,我得到的是下面,它正确地创建了一个新记录,但是我想删除所有比前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();
}
有人能看出我做错了什么吗?
Limit
和offset
不能使用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();