【问题标题】:Laravel Eloquent limit and offsetLaravel Eloquent 限制和偏移量
【发布时间】:2016-06-09 03:58:07
【问题描述】:

这是我的

    $art = Article::where('id',$article)->firstOrFail();
    $products = $art->products;

我只想拿一个限量的“产品” 这是错误的方式

   $products = $art->products->offset($offset*$limit)->take($limit)->get();

请帮帮我!

谢谢!

【问题讨论】:

  • @SangTrần 只需使用products() 而不是products。它会起作用的。
  • 正如 Doan Tran 所提到的,您应该在构建器上调用这些方法,而不是在集合上。集合没有方法skip
  • 请添加您使用的 Laravel 版本。有很多。

标签: laravel eloquent limit offset


【解决方案1】:

请这样尝试,

return Article::where('id',$article)->with(['products'=>function($products, $offset, $limit) {
    return $products->offset($offset*$limit)->limit($limit);
}])

【讨论】:

  • 谢谢 Nisam,但它不起作用。在我的数据库中,一篇文章通过“article_product”表有很多产品。我可以显示所有产品(例如与 article_id =1 相关的产品)
【解决方案2】:

您可以使用skiptake 函数如下:

$products = $art->products->skip($offset*$limit)->take($limit)->get();

// skip 应作为整数值传递参数以跳过记录和起始索引

// take 获取一个整数值来获取编号。 skip定义的起始索引后的记录数

编辑

对不起。我被你的问题误解了。如果您想要分页之类的东西,forPage 方法将适合您。 forPage 方法适用于集合。

REf : https://laravel.com/docs/5.1/collections#method-forpage

例如

$products = $art->products->forPage($page,$limit);

【讨论】:

  • 集合没有skip 方法。
【解决方案3】:
skip = OFFSET
$products = $art->products->skip(0)->take(10)->get(); //get first 10 rows
$products = $art->products->skip(10)->take(10)->get(); //get next 10 rows

来自 laravel doc 5.2 https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

跳过/采取

限制从查询返回的结果数量,或跳过 给定查询中的结果数(OFFSET),您可以使用跳过 并采取方法:

$users = DB::table('users')->skip(10)->take(5)->get();

laravel 5.3 中你可以写 (https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset)

$products = $art->products->offset(0)->limit(10)->get(); 

【讨论】:

    【解决方案4】:

    试试这个示例代码:

    $art = Article::where('id',$article)->firstOrFail();
    
    $products = $art->products->take($limit);
    

    【讨论】:

      【解决方案5】:

      laravel 有自己的函数skip 用于offsettake 用于limit。就像下面的 laravel 查询示例:-

      Article::where([['user_id','=',auth()->user()->id]])
                      ->where([['title','LIKE',"%".$text_val."%"]])
                      ->orderBy('id','DESC')
                      ->skip(0)
                      ->take(2)
                      ->get();
      

      【讨论】:

        【解决方案6】:

        快速:

        Laravel 有一个快速的分页方法,paginate,只需要传入每页显示的数据数即可。

        
        //use the paginate
        Book::orderBy('updated_at', 'desc')->paginate(8);
        
        

        如何自定义分页:

        你可以使用这些方法:offsetlimit,skiptake

        • offset,limit : offset设置从哪里开始,限制查询的数据量

        • skip,take:skip跳过几条数据,取大量数据

        例如:

        
        Model::offset(0)->limit(10)->get();
        
        Model::skip(3)->take(3)->get();
        
        
        //i use it in my project, work fine ~
        
        class BookController extends Controller
        {
            public function getList(Request $request) {
        
                $page = $request->has('page') ? $request->get('page') : 1;
                $limit = $request->has('limit') ? $request->get('limit') : 10;
        
                $books = Book::where('status', 0)->limit($limit)->offset(($page - 1) * $limit)->get()->toArray();
        
                return $this->getResponse($books, count($books));
            }
        }
        
        
        

        【讨论】:

        • 这对于行数少于限制的页面将返回空,因为它的偏移超出了范围。
        【解决方案7】:

        也许是这样

        $products = $art->products->take($limit)->skip($offset)->get();

        【讨论】:

          【解决方案8】:
          $collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);
          
          $chunk = $collection->forPage(2, 3);
          
          $chunk->all();
          

          【讨论】:

            【解决方案9】:

            Laravel 8(适用于 7.16 版本)

            $art->products->skip($offset*$limit)->take($limit)->all();
            

            https://laravel.com/docs/8.x/collections#method-take

            【讨论】:

              猜你喜欢
              • 2015-12-20
              • 1970-01-01
              • 2020-07-27
              • 2011-08-05
              • 1970-01-01
              • 2019-12-25
              • 2016-02-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多