【问题标题】:Skip and take all?跳过并拿走所有?
【发布时间】:2016-08-12 09:56:14
【问题描述】:

在 eloquent 中,如何跳过 10 行然后获取表格的其余部分?

User::skip(10)->all();

上述方法不起作用,但它让您知道我在寻找什么。

【问题讨论】:

    标签: laravel eloquent laravel-5.2


    【解决方案1】:

    试试这个:

    $count = User::count();
    $skip = 10;
    
    User::skip($skip)->take($count - $skip)->get();
    

    一个查询:

    User::skip($skip)->take(18446744073709551615)->get();
    

    很丑,不过是个例子from official MySQL manual

    检索从某个偏移量到结果末尾的所有行 设置,您可以为第二个参数使用一些较大的数字。这 语句检索从第 96 行到最后一行的所有行:

    SELECT * FROM tbl LIMIT 95,18446744073709551615;
    

    【讨论】:

    • 如果你想要数组,那么继续所有:User::skip(10)->get()->all();
    • 谢谢,但这给出了一个错误:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“10”附近使用正确的语法(SQL:select * from users offset 10)。数据库作为 User::all() 工作正常。
    • 谢谢,无论如何要在没有 2 x 查询的情况下执行此操作?
    • 好吧,你可以试试->take(18446744073709551615),这是一个丑陋的解决方案,但它来自官方MySQL手册:dev.mysql.com/doc/refman/5.7/en/select.html#id4651990
    【解决方案2】:

    试试这样的东西肯定会起作用..

    $temp = User::count();
    $count = $temp - 10;
    
    $data = User::take($count)->skip(10)->get();
    

    【讨论】:

      【解决方案3】:

      Laravel 5 将 Eloquent 结果作为 Collection 返回。 所以你可以使用collenction函数slice();

      $users = User::get();
      $slicedUsers = $users->slice(10);
      

      【讨论】:

      • 它会起作用,但如果你用大桌子这样做,它很容易杀死内存。
      • @AlexeyMezenin 是的,没错。但是对于某些人来说,也可以这样解决好。如果他们不使用大桌子。
      • @Autista_z 它将首先检索所有数据 10 将被删除,而不是像 AlexeyMezenin 回答的那样有这样的检索技巧。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多