我正在尝试获取所有最新商品,并按ID降序排序(即获取所有刚刚添加的商品,并带有限制和偏移量)。
所以我这样做了:
$products = Product::all()
->slice($request->get('offset'))
->take($request->get('limit'))
->sortByDesc('id')
->toBase();
但是似乎当我有更多那个限制时,那么我没有正确的顺序。它使我说10种产品,但未进行排序纠正。知道如何用雄辩的ORM做到这一点吗?
[您可能打算让数据库处理偏移量并跳过和排序,而不是提取所有可能的记录,然后只提取所需的内容,然后对它们进行排序...如果要按自己的方式进行操作,则需要顺便说一句,然后再跳过和排序。
使用数据库进行过滤和排序:
$products = Product::skip($request->input('offset'))
->take($request->input('limit'))
->orderBy('id', 'desc')
->get();
[我认为问题在于您首先使用::all()
,它返回Product
中的所有Collection
实例,然后使用收集方法。由于这些方法按使用顺序起作用,因此您在进行排序之前先进行切片和补偿,因此每次都将获得相同的产品。使用适当的Builder
语法正确,更有效地处理此问题:
$products = Product::offset($request->input("offset"))
->limit($request->input("limit"))
->orderBy("id", "DESC")
->get();
由于这是一个Builder
实例,该查询将根据您数据库的语法逻辑在一个查询中进行编译和执行。使用Collection
逻辑没什么错,您只需要使用正确的方法顺序即可(首先sortByDesc()
,然后是slice()
,然后是take()
),但这效率非常低,因为您必须处理每个数据库中的Product
。