216

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

4

19 回答 19

302

您需要按您现在订购的相同字段进行排序,但要降序排列。举个例子,如果你有一个上传完成的时间戳upload_time,你会做这样的事情;

对于 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();

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

于 2013-05-14T17:49:03.993 回答
169

使用 Laravel 提供的最新范围开箱即用。

Model::latest()->first();

这样您就不会检索所有记录。orderBy 的一个更好的快捷方式。

于 2017-04-16T05:59:54.023 回答
82

你从来没有提到你是否使用 Eloquent,Laravel 的默认 ORM。如果您是,假设您想通过 created_at 获取用户表的最新条目,您可能可以执行以下操作:

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

首先它按 created_at 字段对用户进行降序排序,然后获取结果的第一条记录。

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

有关更多信息,请查看非常丰富且详细的官方文档。

于 2014-03-24T04:33:57.903 回答
59

获取最后一条记录的详细信息

  1. Model::all()->last();或者
  2. Model::orderBy('id', 'desc')->first();

获取最后一条记录 id

  1. Model::all()->last()->id;或者
  2. Model::orderBy('id', 'desc')->first()->id;
于 2015-10-07T13:02:37.387 回答
16

Laravel 集合有最后一个方法

Model::all() -> last(); // last element 
Model::all() -> last() -> pluck('name'); // extract value from name field. 

这是最好的方法。

于 2015-09-10T16:24:54.703 回答
12

您可以将 Laravel 提供的最新范围与您要过滤的字段一起使用,假设它将按 ID 排序,然后:

Model::latest('id')->first();

所以通过这种方式,你可以避免created_at在 Laravel 中默认按字段排序。

于 2019-11-18T03:46:35.453 回答
11

试试这个 :

Model::latest()->get();
于 2017-05-22T19:13:50.947 回答
10

很多答案,有些我不太同意。因此,我将再次总结我的评论。

如果您刚刚创建了一个新对象。默认情况下,当你创建一个新对象时,Laravel 会返回这个新对象。

$lastCreatedModel = $model->create($dataArray); 

dd($lastCreatedModel); // will output the new output
echo $lastCreatedModel->key; // will output the value from the last created Object

然后有一种方法可以在没有条件的情况下将方法all()与 (last()first()) 结合起来。

很坏!不要那样做!

Model::get()->last();` // the most recent entry
Model::all()->last();` // the most recent entry

Model::get()->first();` // the oldest entry
Model::all()->first();` // the oldest entry

这基本上是错误的方法!你get() all()的记录,在某些情况下可能是 200,000 或更多,然后只挑出一行。不好!想象一下,您的网站正在从 Facebook 获得流量,然后是这样的查询。在一个月内,这可能意味着像巴黎这样的城市一年的二氧化碳排放量。因为服务器必须不必要地努力工作。所以忘记这种方法,如果你在你的代码中找到它,替换它/重写它。也许您在 100 个数据集时不会注意到它,但在 1000 个或更多数据集时它可能会很明显。

很好的是:

Model::orderBy('id', 'desc')->last(); // the most recent record
Model::latest('id')->first(); // the most recent record
Model::latest('id')->limit(1)->get(); // the most recent record
Model::orderBy('id', 'desc')->limit(1)->get(); // the most recent entry
Model::orderBy('id', 'desc')->first(); // the most recent entry

Model::orderBy('id', 'asc')->first(); // the oldest entry
Model::orderBy('id', 'asc')->limit(1)->get(); // the oldest entry
Model::orderBy('id', 'asc')->first(); // the oldest entry

如果在此上下文中使用 orderBy,则应始终将主键用作基础,而不是 create_at。

于 2021-11-26T08:53:58.240 回答
6

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

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

于 2020-07-28T15:45:09.453 回答
5

要获取最后一条记录的详细信息,请使用以下代码:

Model::where('field', 'value')->get()->last()
于 2017-04-19T11:13:48.527 回答
4

在 Laravel 6.x 中执行此操作的另一种奇特方式(不确定但也必须适用于 5.x):

DB::table('your_table')->get()->last();

您也可以访问字段:

DB::table('your_table')->get()->last()->id;

于 2019-10-21T16:22:26.753 回答
2

使用Model::where('user_id', $user_id)->latest()->get()->first(); 它只会返回一条记录,如果找不到,它将返回null。希望这会有所帮助。

于 2019-09-19T10:11:22.557 回答
2

Model($where)->get()->last()->id

于 2019-10-22T14:44:49.077 回答
2

老实说,这太令人沮丧了,我几乎不得不在这里浏览整个答案集合,才能发现他们中的大多数人没有做我想做的事。事实上,我只想向浏览器显示以下内容:

  1. 在我的桌子上创建的最后一行
  2. 仅 1 个资源

我不想订购一组资源并以降序方式排列该列表,下面的代码行对我来说是在 Laravel 8 项目中工作的。

Model::latest()->limit(1)->get();
于 2021-05-14T17:06:47.223 回答
1

如果您正在寻找您刚刚在 Laravel 3 和 4 中插入的实际行,当您对新模型执行saveor操作时,例如:create

$user->save();

-或者-

$user = User::create(array('email' => 'example@gmail.com'));

然后将返回插入的模型实例,并可用于进一步的操作,例如重定向到刚刚创建的用户的个人资料页面。

在低容量系统上查找最后插入的记录几乎可以一直工作,但是如果您必须同时插入,您最终可能会查询以找到错误的记录。在需要更新多个表的事务系统中,这确实会成为一个问题。

于 2013-05-14T19:19:34.193 回答
1

不知何故,以上所有内容在 laravel 5.3 中似乎对我不起作用,所以我使用以下方法解决了我自己的问题:

Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();

希望能够保释某人。

于 2017-01-01T02:40:52.893 回答
1

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

于 2020-04-28T14:44:24.297 回答
1

对于laravel 8

Model::orderBy('id', 'desc')->withTrashed()->take(1)->first()->id

生成的sql查询:

Model::orderBy('id', 'desc')->withTrashed()->take(1)->toSql()

select * from "timetables" order by "id" desc limit 1

于 2021-01-15T14:35:11.800 回答
0

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

于 2018-12-25T03:19:51.327 回答