在表格中选择最后一行

时间:2013-05-14 17:38:54

标签: laravel eloquent

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

17 个答案:

答案 0 :(得分:154)

您需要按照现在订购的相同字段进行订购,但需要降序。 例如,如果您在上传完成时有一个名为upload_time的时间戳,那么您可以执行以下操作;

对于Pre-Laravel 4

return DB::table('files')->order_by('upload_time', 'desc')->first();

Laravel 4及以后

return DB::table('files')->orderBy('upload_time', 'desc')->first();

这将按上传时间降序对文件表中的行进行排序,然后选择第一行。这将是最新上传的文件。

答案 1 :(得分:69)

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

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

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

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

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

答案 2 :(得分:69)

使用Laravel提供的最新范围。

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

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

答案 3 :(得分:23)

获取最后的记录详情

  1. Model ::all()->last();
  2. Model ::orderBy('id', 'desc')->first();
  3. 获取最后一条记录ID

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

答案 4 :(得分:9)

试试这个:

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

答案 5 :(得分:3)

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

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

您也可以访问字段:

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

$user->save();

-OR -

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

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

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

答案 8 :(得分:1)

不知怎的,以上所有似乎都不适合我在laravel 5.3, 所以我用以下方法解决了自己的问题:

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

希望能够保释某人。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

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

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

答案 11 :(得分:1)

不要使用Model::latest()->first();,因为如果您的集合中有多个同时创建的行(当您使用数据库事务DB::beginTransaction();DB::commit()时会发生),则第一行该集合将被返回,显然这将不是最后一行。

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

答案 12 :(得分:0)

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

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

我不希望对一组资源进行排序并以降序排列该列表,下面的代码行对我在 Laravel 8 项目中有用。

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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