我想检索插入到表中的最后一个文件。我知道方法first()存在,并为您提供表中的第一个文件,但我不知道如何获得最后一个插入。


当前回答

您将需要按照您现在正在排序的相同字段进行排序,但是降序。 举个例子,如果你有一个名为upload_time的上传时间戳,你可以这样做;

Pre-Laravel 4

return DB::table('files')->order_by('upload_time', 'desc')->first();

Laravel 4及以上版本

return DB::table('files')->orderBy('upload_time', 'desc')->first();

适用于Laravel 5.7及以上版本

return DB::table('files')->latest('upload_time')->first();

这将按上传时间、降序对文件表中的行进行排序,并选择第一个。这将是最新上传的文件。

其他回答

你从来没有提到你是否使用Eloquent, Laravel的默认ORM。如果你是,让我们假设你想要获得一个User表的最新条目,通过created_at,你可能会这样做:

User::orderBy('created_at', 'desc')->first();

首先,它根据created_at字段逐级排序用户,然后获取结果的第一条记录。

这将返回User对象的一个实例,而不是一个集合。当然,为了使用这个替代方案,您必须有一个User模型,扩展Eloquent类。这听起来可能有点令人困惑,但它真的很容易开始,ORM真的很有帮助。

要了解更多信息,请查看官方文档,它非常丰富和详细。

如果表有日期字段,这(User::orderBy('created_at', 'desc')->first();)是最好的解决方案,我认为。 但没有日期字段,Model::orderBy('id', 'desc')->first()->id;我相信这是最好的解决办法。

不要使用Model::latest()->first();因为如果你的集合有多行创建在同一时间戳(这将发生在你使用数据库事务DB::beginTransaction();和DB::commit())则返回集合的第一行,显然这不是最后一行。

假设id为11、12、13的行是使用transaction创建的,那么它们都将具有相同的时间戳,因此您将通过Model::latest()->first();id: 11的行。

你只需要检索数据并反转它们,你就会得到你想要的记录,让我解释laravel 9的代码

return DB::table('files')->orderBy('upload_time', 'desc')->first();

如果你不愿意。x的最后结果

 return DB::table('files')->orderBy('upload_time', 'desc')->limit(x)->get();

请注意,如果您正在寻找顺序的或事件/有序的记录,last()、latest()是不确定的。最后/最近的记录可以具有完全相同的created_at时间戳,而您返回的是哪一个不是确定的。所以做orderBy(id|foo)->first()。欢迎其他关于如何确定的想法/建议。