【问题标题】:Laravel Query Builder where max idLaravel 查询生成器,其中最大 id
【发布时间】:2014-05-29 04:29:59
【问题描述】:

如何在 Laravel 4.1 Query Builder 中实现这一点?

select * from orders where id = (select max(`id`) from orders)

我试过这个,工作但无法获得雄辩的功能。

DB::select(DB::raw('select * from orders where id = (select max(`id`) from orders)'));

有什么办法让它变得更好吗?

【问题讨论】:

    标签: php laravel query-builder


    【解决方案1】:

    您应该能够在 order 表上执行选择,使用原始 WHERE 在子查询中查找 max(id),如下所示:

     \DB::table('orders')->where('id', \DB::raw("(select max(`id`) from orders)"))->get();
    

    如果您想使用 Eloquent(例如,您可以将响应转换为对象),您将需要使用 whereRaw,因为如果不使用 Eloquent 模型,某些函数(例如 toJSONtoArray)将无法工作。

     $order = Order::whereRaw('id = (select max(`id`) from orders)')->get();
    

    当然,这要求您有一个扩展 Eloquent 的模型。

     class Order extends Eloquent {}
    

    正如 cmets 中提到的,您不需要使用 whereRaw,您可以使用查询生成器执行整个查询,而无需使用原始 SQL。

     // Using the Query Builder
     \DB::table('orders')->find(\DB::table('orders')->max('id'));
    
     // Using Eloquent
     $order = Order::find(\DB::table('orders')->max('id'));
    

    (请注意,如果 id 字段不是唯一的,您只会返回一行 - 这是因为 find() 只会从 SQL 服务器返回第一个结果。)。

    【讨论】:

    • 可以把toArray()做成链式吗?如果我附加 ->toArray() 会出现错误。
    • @Shiro toArray() 是 Eloquent 的模型方法,而不是 DB。您将需要改用whereRaw()。我已经更新了我的答案。
    • 谢谢你的回答,我可以知道你为什么要放 array(25) 吗?
    • 这里不需要原始查询,其他答案之一是更好的解决方案。
    • @ErikBerkun-Drevnig,我已经编辑了我的帖子。我确实写了这个答案,所以它可以用于任何领域。另请注意,原始答案并未限制查询返回多于一行。这是(恕我直言)需要注意的重要事项。例如,如果我想使用此查询来查找具有max(age)min(age) 的用户配置文件。我不想将我的结果限制在一行。
    【解决方案2】:

    就像docs say

    DB::table('orders')->max('id');
    

    【讨论】:

    • 我想获取整个记录,不仅是最大 id,而且我不想进行两次查询。
    • @Shiro 抱歉,您必须为此执行查询链,因为 laravel 的流畅查询构建器不允许将其作为单个字符串完成,祝您好运
    • 感谢您的简单!
    • 我需要下一个 ID:protected function find_next_id_number() { return Module::max('id') + 1; }
    【解决方案3】:

    对于 Laravel ^5

    Orders::max('id');
    

    我用的是短而最好的;

    【讨论】:

      【解决方案4】:

      不需要使用子查询,试试这个,它工作正常:

        DB::table('orders')->orderBy('id', 'desc')->pluck('id');
      

      Laravel 5+:

        DB::table('orders')->orderBy('id', 'desc')->value('id');
       
      

      【讨论】:

      • 这是一个糟糕的解决方案。它强制 MySQL 查看所有行、过滤它们、排序它们,然后返回结果。不要这样做。而是选择类似于Orders::max('id') 的东西
      • @Edward 为什么这会很糟糕?如果表上有一个索引(最有可能是一个“id”),那么数据库会处理得很好,就像最简单的 order by。
      • 运行一个测试,Laravel 将其优化为select * from `orders` order by `id` desc limit 1,因此不会在设置限制时提取所有结果。如果没有钥匙,它需要做更多的工作。
      【解决方案5】:

      对于对象,您可以嵌套查询:

      DB::table('orders')->find(DB::table('orders')->max('id'));
      

      所以内部查询会在表中查找最大 id,然后将其传递给 find,它会返回对象。

      【讨论】:

        【解决方案6】:

        您可以获取添加到 Orders 表中的最新记录您可以使用 eloquent 的方法来检索max aggregate

        $lastOrderId = Order::max('id');
        

        要通过 id 列值检索单行,请使用 find 方法:

        $order = Order::find(3);
        

        因此,将它们组合起来,将最后一个模型添加到您的表中,您可以使用以下方法:

        $lastOrder = Order::find(Order::max('id'));
        

        【讨论】:

          猜你喜欢
          • 2017-10-15
          • 2015-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-01
          • 2016-01-10
          • 2019-01-29
          相关资源
          最近更新 更多