Laravel雄辩的限制和偏移


80

这是我的

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

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

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

请帮帮我!

谢谢!



@SangTrần仅在使用products()替代products。而且会起作用。
Doan Tran'2

正如Doan Tran所述,您应该在构建器而不是集合上调用这些方法。集合没有方法skip
lagbox '02

请添加您正在使用的Laravel版本。有很多。
lagbox '16

Answers:


135
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),可以使用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(); 

15

快:

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


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

如何自定义分页:

您可以使用这些方法offsetlimitskip, ,take

  • offset,limit:偏移设置从何处开始,限制了要查询的数据量

  • 跳过,获取:跳过跳过一些数据并获取大量数据

例如:


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



对于行数少于限制的页面,这将返回空值,因为其偏移量超出了范围。
Jovanni G

10

laravelskip对于offsettakefor具有自己的功能limit。就像下面的laravel查询示例:-

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

5

您可以使用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方法。
lagbox '16


0

试试这个示例代码:

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

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



-1

请这样尝试

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

谢谢,尼萨姆,但没有用。在我的数据库中,文章通过“ article_product”表具有许多产品。我可以显示所有产品(例如,与article_id = 1相关的产品)
SangTrần16年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.