ChatGPT解决这个技术问题 Extra ChatGPT

选择表中的最后一行

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

另请参阅stackoverflow.com/questions/33321447/…如何对现有关系进行排序 (hasMany)
这适用于任何询问和回答有关 Laravel 的人。请记住,指定您正在谈论的 Laravel 版本很重要。通常版本 4 和 5 与旧版本也有差异。

M
ManojKiran Appathurai

您需要按您现在订购的相同字段进行排序,但要降序排列。例如,如果您在上传完成时有一个名为 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 4,这应该是 orderBy,而不是 order_by
当您使用 ORM 时,这是正确的方法:User::orderby('created_at', 'desc')->first();
Laravel 5.x = orderBy('created_at', 'desc')
你为什么使用 created_at 列?使用主键 ID 更快。 Laravel 5.x Files::orderBy(id', 'desc')->first(); 按日期排序的工作时间更长,因为日期是字符串并且很可能没有索引。虽然主键被索引并且工作速度非常快。即使 created_at 被索引,它也是索引字符串,而不是主索引的 INT。索引字符串的性能较差。
@KorbenDallas 评论应该是答案,因为有时 orderBy('created_at', 'desc') 不会给你最后一行。示例:3 行可以具有完全相同的 TIMESTAMP 值,使用 orderBy('created_at', 'desc') 您将获得 3 行中的第一个(不一定是最后一行)
N
Nick

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

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

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


请注意,此方法使用模型中自动生成的 created_at($timestamps = true),但可以随意禁用,因此如果未定义,则会出现错误
我正在使用 Laravel 5.7 并尝试在模型上执行此操作仍然为我检索所有记录。
请注意,如果您在同一秒内添加了多条记录,则这些记录的 created_at 时间将相同,因此 latest() 返回的记录可能不是您期望的记录。
请注意,您不需要“created_at”列。您可以从您想要最新的列中指定。例如:Model::latest('dateColumn')->first();
如果在 1 秒内插入两行,这可能无法获取实际的最后一行(实际上是在单元测试中引起问题)。
T
Thelambofgoat

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

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

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

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

有关更多信息,请查看非常丰富且详细的 official documentation


这会引发一个错误,我的列“video_title”是 STRING 类型的,Attempt to read property "video_title" on bool 它也是 2021 年(它可能是一个旧答案)并且我使用的是 Laravel 8,谢谢!
例如,在用户模型中的 realtionship $this->posts()->latest()->first() 的情况下。
H
Haseena P A

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

模型::all()->last();或 Model::orderBy('id', 'desc')->first();

获取最后一条记录 id

模型::all()->last()->id;或 Model::orderBy('id', 'desc')->first()->id;


如果你使用第一个选项,你可能会让你的 PHP 死掉,试图在它拥有的可用内存中分配信息。它基本上获取整个表,为每条记录创建一个实例,并将其存储在 RAM 中。然后,它只获取最后一条记录,但前提是 PHP 还没有死。第二种方法是有效的方法,因为它只从数据库中获取必要的信息。
M
Maik Lowrey

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

如果您刚刚创建了一个新对象。默认情况下,当你创建一个新对象时,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。


m
mdamia

Laravel 集合有最后一个方法

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

这是最好的方法。


只是想指出 all() 方法实际上加载了所有项目。这不适用于具有数百万条记录的表。
除了 Steven Jeffries 的评论,我想指出调用 last() 返回单个 Eloquent 实例而不是 Collection,并且在其上调用 pluck() 等于调用 Model::all()->pluck('name'),因此返回 name 属性所有表中的行
这种方法实际上更糟糕。您正在使用 PHP 执行而不是作为数据库级别来获取最后一个原始数据。如果 table 有数百万个 raw 怎么办,那么你知道它的效率有多低吗?
这是最好的方法。 - 不!从来没有,永远不会。您将加载所有行,而不仅仅是您需要的行。
喜欢这个 bcz 如果您的表没有 created_at 或任何类似的列,这不需要任何时间戳列
t
tiaguinhow

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

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

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


如果 id 是 uuid 怎么办?
@BariqDharmawan 你可以做 Model::latest('uuid')->first() 或任何你想要的领域。
Wow IDK latest() 方法适用于 uuid。 Bcz 我认为这是一个完全随机的字符串,不能按 asc 排序。谢谢
U
Udhav Sarvaiya

尝试这个 :

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

这将返回多行。他需要单排。 first() 将帮助他处理 orderBy() 子句。
如果在 1 秒内插入两行,这可能无法获取实际的最后一行(实际上是在单元测试中引起问题)。
在大表上,这将导致内存不足异常,因为正如@TahirAfridi 提到的那样,这会将所有行加载到内存中。
R
Rayhanur Rahaman Rubel

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

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


@Mohammad正确的方法是:Model::orderBy('id', 'desc')->first();这里的'id'是表的主键(自动增量)。
佚名

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

Model::where('field', 'value')->get()->last()

不要使用它。这是一个非常糟糕的做法,有一个范围 latest() 它提供对最后插入的行的直接访问。
T
Towelie

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

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

您也可以访问字段:

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


在 Laravel 5.8 中也适用于我,只是在看到你的答案之前发布了答案
稍微解释一下 laravel 如何在后台执行此操作以及为什么这对大型数据集很危险,get() 方法将从 your_table 获取所有内容并生成一个集合,last() 方法将从该集合中获取最后一项。因此,您已经将表中的所有数据加载到您的内存中(坏)。您应该只使用 `DB::table('items')->latest()->first();` 在它执行 `orderBy($column, 'desc')` 的场景后面并获取第一条记录。
D
Dazzle

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


E
Eduardo

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

在我的表上创建的最后一行只有 1 个资源

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

Model::latest()->limit(1)->get();

风声猎猎

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


d
doox911

对于 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


b
bloggidy

如果您正在寻找在新模型上执行 savecreate 操作时使用 Laravel 3 和 4 插入的实际行,例如:

$user->save();

-或者-

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

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

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


T
The Billionaire Guy

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

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

希望能够保释某人。


m
mangonights

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


w
wang xin

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