ChatGPT解决这个技术问题 Extra ChatGPT

Laravel Eloquent 限制和偏移量

这是我的

    $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 版本。其中有很多。

A
Atiqur
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 文档 5.2 https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

skip / take 要限制从查询返回的结果数量,或者在查询中跳过给定数量的结果(OFFSET),您可以使用 skip 和 take 方法: $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(); 

w
water_ak47

快的:

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));
    }
}



对于行数少于限制的页面,这将返回空,因为它的偏移超出了范围。
n
nageen nayak

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();

A
Ali

您可以使用如下 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 方法。
S
Slmmgdd

也许这

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


S
Suraj Rao
$products = Article::orderBy('id', 'asc')->limit($limit)->get();

B
Brane

试试这个示例代码:

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

$products = $art->products->take($limit);

v
vimuth
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);

$chunk = $collection->forPage(2, 3);

$chunk->all();

N
Nisam

请尝试这样,

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

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

Laravel 5.1<(当前 v 9)

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

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