Laravel Eloquent 限制和偏移量
Posted
技术标签:
【中文标题】Laravel Eloquent 限制和偏移量【英文标题】:Laravel Eloquent limit and offset 【发布时间】:2016-06-09 03:58:07 【问题描述】:这是我的
$art = Article::where('id',$article)->firstOrFail();
$products = $art->products;
我只想拿一个限量的“产品” 这是错误的方式
$products = $art->products->offset($offset*$limit)->take($limit)->get();
请帮帮我!
谢谢!
【问题讨论】:
这会帮助你***.com/questions/27457249/… @SangTrần 只需使用products()
而不是products
。它会起作用的。
正如 Doan Tran 所提到的,您应该在构建器上调用这些方法,而不是在集合上。集合没有方法skip
。
请添加您使用的 Laravel 版本。有很多。
【参考方案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】:您可以使用skip
和take
函数如下:
$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
用于offset
和take
用于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);
如何自定义分页:
你可以使用这些方法:offset
,limit
,skip
,take
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
【讨论】:
以上是关于Laravel Eloquent 限制和偏移量的主要内容,如果未能解决你的问题,请参考以下文章