我想检索插入到我的表中的最后一个文件。我知道方法 first()
存在并为您提供表中的第一个文件,但我不知道如何获取最后一个插入。
您需要按您现在订购的相同字段进行排序,但要降序排列。例如,如果您在上传完成时有一个名为 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 的一个更好的快捷方式。
created_at
列 ($timestamps = true)
,但可以随意禁用,因此如果未定义,则会出现错误
你从来没有提到你是否使用 Eloquent,Laravel 的默认 ORM。如果您是,假设您想通过 created_at 获取用户表的最新条目,您可能可以执行以下操作:
User::orderBy('created_at', 'desc')->first();
首先它按 created_at 字段对用户进行降序排序,然后获取结果的第一条记录。
这将返回一个 User 对象的实例,而不是一个集合。当然,要使用这个替代方案,你必须有一个 User 模型,扩展 Eloquent 类。这听起来可能有点令人困惑,但它很容易上手,而且 ORM 真的很有帮助。
有关更多信息,请查看非常丰富且详细的 official documentation。
Attempt to read property "video_title" on bool
它也是 2021 年(它可能是一个旧答案)并且我使用的是 Laravel 8,谢谢!
$this->posts()->latest()->first()
的情况下。
获取最后一条记录的详细信息
模型::all()->last();或 Model::orderBy('id', 'desc')->first();
获取最后一条记录 id
模型::all()->last()->id;或 Model::orderBy('id', 'desc')->first()->id;
很多答案,有些我不太同意。因此,我将再次总结我的评论。
如果您刚刚创建了一个新对象。默认情况下,当你创建一个新对象时,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。
Laravel 集合有最后一个方法
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
这是最好的方法。
all()
方法实际上加载了所有项目。这不适用于具有数百万条记录的表。
last()
返回单个 Eloquent 实例而不是 Collection,并且在其上调用 pluck()
等于调用 Model::all()->pluck('name')
,因此返回 name
属性所有表中的行
created_at
或任何类似的列,这不需要任何时间戳列
您可以将 Laravel 提供的最新范围与您要过滤的字段一起使用,假设它将按 ID 排序,然后:
Model::latest('id')->first();
因此,通过这种方式,您可以避免在 Laravel 中默认按 created_at
字段排序。
uuid
怎么办?
Model::latest('uuid')->first()
或任何你想要的领域。
latest()
方法适用于 uuid。 Bcz 我认为这是一个完全随机的字符串,不能按 asc 排序。谢谢
尝试这个 :
Model::latest()->get();
不要使用 Model::latest()->first();
,因为如果您的集合在同一时间戳创建了多行(当您使用数据库事务 DB::beginTransaction();
和 DB::commit()
时会发生这种情况),那么将返回集合的第一行,显然这将不是最后一排。
假设 id 为 11、12、13 的行是使用事务创建的,那么它们都将具有相同的时间戳,因此您将通过 Model::latest()->first();
获得 id 为 11 的行。
Model::orderBy('id', 'desc')->first();
这里的'id'是表的主键(自动增量)。
要获取最后一条记录的详细信息,请使用以下代码:
Model::where('field', 'value')->get()->last()
在 Laravel 6.x 中执行此操作的另一种奇特方式(不确定但也必须适用于 5.x):
DB::table('your_table')->get()->last();
您也可以访问字段:
DB::table('your_table')->get()->last()->id;
get()
方法将从 your_table
获取所有内容并生成一个集合,last()
方法将从该集合中获取最后一项。因此,您已经将表中的所有数据加载到您的内存中(坏)。您应该只使用 `DB::table('items')->latest()->first();` 在它执行 `orderBy($column, 'desc')` 的场景后面并获取第一条记录。
Model($where)->get()->last()->id
老实说,这太令人沮丧了,我几乎不得不在这里浏览整个答案集合,才能发现他们中的大多数人没有做我想做的事。事实上,我只想向浏览器显示以下内容:
在我的表上创建的最后一行只有 1 个资源
我不想订购一组资源并以降序方式排列该列表,下面的代码行对我来说是在 Laravel 8 项目中工作的。
Model::latest()->limit(1)->get();
使用Model::where('user_id', $user_id)->latest()->get()->first();
将只返回一条记录,如果找不到,它将返回null
。希望这会有所帮助。
对于 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
如果您正在寻找在新模型上执行 save
或 create
操作时使用 Laravel 3 和 4 插入的实际行,例如:
$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()
也是如此。欢迎其他关于如何确定性的想法/建议。
如果表格有日期字段,我认为 this(User::orderBy('created_at', 'desc')->first();
) 是最好的解决方案。但是没有日期字段,Model ::orderBy('id', 'desc')->first()->id;
是最好的解决方案,我敢肯定。
不定期副业成功案例分享
orderBy
,而不是order_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
按日期排序的工作时间更长,因为日期是字符串并且很可能没有索引。虽然主键被索引并且工作速度非常快。即使 created_at 被索引,它也是索引字符串,而不是主索引的 INT。索引字符串的性能较差。orderBy('created_at', 'desc')
不会给你最后一行。示例:3 行可以具有完全相同的 TIMESTAMP 值,使用orderBy('created_at', 'desc')
您将获得 3 行中的第一个(不一定是最后一行)