雄辩的ORM获取最新的物品查询

问题描述 投票:0回答:2

我正在尝试获取所有最新商品,并按ID降序排序(即获取所有刚刚添加的商品,并带有限制和偏移量)。

所以我这样做了:

$products = Product::all()
                ->slice($request->get('offset'))
                ->take($request->get('limit'))
                ->sortByDesc('id')
                ->toBase();

但是似乎当我有更多那个限制时,那么我没有正确的顺序。它使我说10种产品,但未进行排序纠正。知道如何用雄辩的ORM做到这一点吗?

laravel eloquent lumen
2个回答
1
投票

[您可能打算让数据库处理偏移量并跳过和排序,而不是提取所有可能的记录,然后只提取所需的内容,然后对它们进行排序...如果要按自己的方式进行操作,则需要顺便说一句,然后再跳过和排序。

使用数据库进行过滤和排序:

$products = Product::skip($request->input('offset'))
    ->take($request->input('limit'))
    ->orderBy('id', 'desc')
    ->get();

1
投票

[我认为问题在于您首先使用::all(),它返回Product中的所有Collection实例,然后使用收集方法。由于这些方法按使用顺序起作用,因此您在进行排序之前先进行切片和补偿,因此每次都将获得相同的产品。使用适当的Builder语法正确,更有效地处理此问题:

$products = Product::offset($request->input("offset"))
->limit($request->input("limit"))
->orderBy("id", "DESC")
->get();

由于这是一个Builder实例,该查询将根据您数据库的语法逻辑在一个查询中进行编译和执行。使用Collection逻辑没什么错,您只需要使用正确的方法顺序即可(首先sortByDesc(),然后是slice(),然后是take()),但这效率非常低,因为您必须处理每个数据库中的Product

© www.soinside.com 2019 - 2024. All rights reserved.