【问题标题】:Laravel skip and delete records from DatabaseLaravel 从数据库中跳过和删除记录
【发布时间】:2021-02-23 12:54:05
【问题描述】:

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

到目前为止,我得到的是以下内容,它正确地创建了一条新记录,但是我想删除所有早于前 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();
}

谁能看出我做错了什么?

【问题讨论】:

    标签: database laravel eloquent record


    【解决方案1】:

    首先,skip() 不会跳过 x 条最近记录,而是跳过从结果集开头开始的 x 条记录。所以为了得到你想要的结果,你需要以正确的顺序对数据进行排序。 orderBy() 默认为升序,但它接受第二个方向参数。试试orderBy('created_at', 'DESC')。 (请参阅orderBy() 上的docs。)

    这就是我建议编写查询的方式。

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

    【讨论】:

      【解决方案2】:

      Limitoffset 不适用于删除,因此您可以执行以下操作:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多