在表格中选择最后一行

Car*_*ñol 126 laravel eloquent

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

Joa*_*son 176

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

对于Pre-Laravel 4

return DB::table('files')->order_by('upload_time', 'desc')->first();
Run Code Online (Sandbox Code Playgroud)

对于Laravel 4及以后

return DB::table('files')->orderBy('upload_time', 'desc')->first();
Run Code Online (Sandbox Code Playgroud)

这将按上传时间,降序排序文件表中的行,然后取第一个.这将是最新上传的文件.

  • 对于Laravel 4,这应该是`orderBy`,而不是`order_by` (15认同)
  • 当你使用ORM时,这是一种正确的方法:`User :: orderby('created_at','desc') - > first();` (9认同)
  • 为什么使用created_at列?使用主键ID要快得多.Laravel 5.x```Files :: orderBy(id','desc') - > first();```按日期排序的工作时间更长,因为date是字符串,很可能没有编入索引.虽然主键被索引并且工作速度超快.即使created_at被索引,它也是索引字符串,而不是主要情况下的INT.索引字符串的性能较低. (7认同)
  • Laravel 5.x = `orderBy('created_at', 'desc')` (4认同)
  • @KorbenDallas评论应该是答案,因为有时`orderBy('created_at','desc')`不会给你最后一行.示例:3行可以具有完全相同的TIMESTAMP值,并且使用`orderBy('created_at','desc')`您将获得3中的第一行(不一定是最后一行) (3认同)

小智 87

使用Laravel提供的最新范围.

Model::latest()->first();
Run Code Online (Sandbox Code Playgroud)

这样你就不会检索所有记录.orderBy的更好的快捷方式.

  • 请注意,此方法在模型中使用自动生成的`created_at`列`($ timestamps = true)`,但可以在希望时禁用,因此如果未定义则会出现错误 (6认同)
  • 请注意,如果您在同一秒内添加了多条记录,则这些记录的created_at时间将相同,因此latest()返回的记录可能不是您期望的记录。 (2认同)
  • 请注意,您不需要“created_at”列。您可以指定您想要最新的列。例如: Model::latest('dateColumn')->first(); (2认同)

Lui*_*ese 73

您从未提及是否使用Eloquent,Laravel的默认ORM.如果你是,假设你想通过created_at得到User表的最新条目,你可能会这样做:

User::orderBy('created_at', 'desc')->first();
Run Code Online (Sandbox Code Playgroud)

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

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

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


Mai*_*rey 42

很多答案,有些我不太同意。所以我会再次总结我的评论。

\n

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

\n
$lastCreatedModel = $model->create($dataArray); \n\ndd($lastCreatedModel); // will output the new output\necho $lastCreatedModel->key; // will output the value from the last created Object\n
Run Code Online (Sandbox Code Playgroud)\n

然后是不带条件地将方法all()与 (last()和)组合起来的方法。first()

\n

很坏!不要那样做!

\n
$lastCreatedModel = $model->create($dataArray); \n\ndd($lastCreatedModel); // will output the new output\necho $lastCreatedModel->key; // will output the value from the last created Object\n
Run Code Online (Sandbox Code Playgroud)\n

这基本上是错误的做法!您get() all()记录的记录(在某些情况下可能有 200,000 条或更多),然后只挑选一行。不好!想象一下,您的网站从 Facebook 获取流量,然后收到类似的查询。一个月的时间可能意味着像巴黎这样的城市一年的 CO\xc2\xb2 排放量。因为服务器必须进行不必要的辛苦工作。因此,请忘记这种方法,如果您在代码中找到它,请替换/重写它。也许您在 100 个数据集时不会注意到它,但在 1000 个或更多数据集时,它可能会很明显。

\n

非常好的将是:

\n
Model::get()->last();` // the most recent entry\nModel::all()->last();` // the most recent entry\n\nModel::get()->first();` // the oldest entry\nModel::all()->first();` // the oldest entry\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n


Has*_*P A 35

获取最后的记录详细信息

__PRE__

获取最后一个记录ID

__PRE__


mda*_*mia 13

Laravel系列最后有方法

Model::all() -> last(); // last element 
Model::all() -> last() -> pluck('name'); // extract value from name field. 
Run Code Online (Sandbox Code Playgroud)

这是最好的方法.

  • 只想指出`all()`方法实际上加载了所有项目.这不适用于具有数百万条记录的表. (15认同)
  • 这种方法实际上更糟.您使用PHP执行而不是将其作为数据库级别来获取最后一个原始数据.如果表有数百万的原始数据,那么你知道它的效率是多少呢? (5认同)

Mar*_*ero 12

试试这个 :

型号::最新() - > get()方法;

  • 这将返回多行。他需要单排。first() 将帮助他使用 orderBy() 子句。 (2认同)

小智 9

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

Model::latest('id')->first();
Run Code Online (Sandbox Code Playgroud)

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


Ray*_*bel 8

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

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

  • @Mohammad正确的方法是:`Model::orderBy('id', 'desc')->first();` 这里'id'是表的主键(自动递增)。 (2认同)

小智 5

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

Model::where('field', 'value')->get()->last()
Run Code Online (Sandbox Code Playgroud)