我想检索插入到我的表中的最后一个文件。我知道该方法first()
存在并为您提供表中的第一个文件,但我不知道如何获取最后一个插入。
19 回答
您需要按您现在订购的相同字段进行排序,但要降序排列。举个例子,如果你有一个上传完成的时间戳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();
这将按上传时间、降序对文件表中的行进行排序,并取第一个。这将是最新上传的文件。
使用 Laravel 提供的最新范围开箱即用。
Model::latest()->first();
这样您就不会检索所有记录。orderBy 的一个更好的快捷方式。
你从来没有提到你是否使用 Eloquent,Laravel 的默认 ORM。如果您是,假设您想通过 created_at 获取用户表的最新条目,您可能可以执行以下操作:
User::orderBy('created_at', 'desc')->first();
首先它按 created_at 字段对用户进行降序排序,然后获取结果的第一条记录。
这将返回一个 User 对象的实例,而不是一个集合。当然,要使用这个替代方案,你必须有一个 User 模型,扩展 Eloquent 类。这听起来可能有点令人困惑,但它很容易上手,而且 ORM 真的很有帮助。
有关更多信息,请查看非常丰富且详细的官方文档。
获取最后一条记录的详细信息
Model::all()->last();
或者Model::orderBy('id', 'desc')->first();
获取最后一条记录 id
Model::all()->last()->id;
或者Model::orderBy('id', 'desc')->first()->id;
Laravel 集合有最后一个方法
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
这是最好的方法。
您可以将 Laravel 提供的最新范围与您要过滤的字段一起使用,假设它将按 ID 排序,然后:
Model::latest('id')->first();
所以通过这种方式,你可以避免created_at
在 Laravel 中默认按字段排序。
试试这个 :
Model::latest()->get();
很多答案,有些我不太同意。因此,我将再次总结我的评论。
如果您刚刚创建了一个新对象。默认情况下,当你创建一个新对象时,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。
不要使用Model::latest()->first();
,因为如果您的集合在同一时间戳创建了多行(这将在您使用数据库事务时发生DB::beginTransaction();
)DB::commit()
,那么将返回集合的第一行,显然这不会是最后一行。
假设 id 为 11、12、13 的行是使用事务创建的,那么它们都将具有相同的时间戳,因此您将得到Model::latest()->first();
id 为 11 的行。
要获取最后一条记录的详细信息,请使用以下代码:
Model::where('field', 'value')->get()->last()
在 Laravel 6.x 中执行此操作的另一种奇特方式(不确定但也必须适用于 5.x):
DB::table('your_table')->get()->last();
您也可以访问字段:
DB::table('your_table')->get()->last()->id;
使用Model::where('user_id', $user_id)->latest()->get()->first();
它只会返回一条记录,如果找不到,它将返回null
。希望这会有所帮助。
Model($where)->get()->last()->id
老实说,这太令人沮丧了,我几乎不得不在这里浏览整个答案集合,才能发现他们中的大多数人没有做我想做的事。事实上,我只想向浏览器显示以下内容:
- 在我的桌子上创建的最后一行
- 仅 1 个资源
我不想订购一组资源并以降序方式排列该列表,下面的代码行对我来说是在 Laravel 8 项目中工作的。
Model::latest()->limit(1)->get();
如果您正在寻找您刚刚在 Laravel 3 和 4 中插入的实际行,当您对新模型执行save
or操作时,例如:create
$user->save();
-或者-
$user = User::create(array('email' => 'example@gmail.com'));
然后将返回插入的模型实例,并可用于进一步的操作,例如重定向到刚刚创建的用户的个人资料页面。
在低容量系统上查找最后插入的记录几乎可以一直工作,但是如果您必须同时插入,您最终可能会查询以找到错误的记录。在需要更新多个表的事务系统中,这确实会成为一个问题。
不知何故,以上所有内容在 laravel 5.3 中似乎对我不起作用,所以我使用以下方法解决了我自己的问题:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
希望能够保释某人。
请注意,如果您正在寻找顺序或事件/有序记录,则 , 不是确定性的last()
。latest()
最后/最近的记录可以具有完全相同的created_at
时间戳,并且您返回的时间戳是不确定的。就这样吧orderBy(id|foo)->first()
。欢迎其他关于如何确定性的想法/建议。
对于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
如果表有日期字段User::orderBy('created_at', 'desc')->first();
,我认为 this() 是最好的解决方案。但是没有日期字段Model ::orderBy('id', 'desc')->first()->id;
,我敢肯定,这是最好的解决方案。