Eloquent ORM获取最新物品查询
Eloquent ORM get latest items query
我正在尝试获取所有最新项目并按 id 降序排序(即获取所有刚刚添加的具有限制和偏移量的项目)。
所以我这样做了:
$products = Product::all()
->slice($request->get('offset'))
->take($request->get('limit'))
->sortByDesc('id')
->toBase();
然而,似乎当我有更多的限制时,我就没有正确的顺序。它让我说 10 种产品,但没有分类更正。知道如何使用 Eloquent ORM 做到这一点吗?
我认为问题是您首先使用 ::all()
,returns Product
个 Collection
中的所有实例,然后使用收集方法。由于这些方法按使用顺序起作用,因此您在排序之前先进行切片和偏移,因此每次都会得到相同的产品。使用正确的 Builder
语法来正确且更有效地处理此问题:
$products = Product::offset($request->input("offset"))
->limit($request->input("limit"))
->orderBy("id", "DESC")
->get();
因为这是一个 Builder
实例,查询将根据数据库的语法逻辑在单个查询中编译和执行。使用 Collection
逻辑没有错,您只需要使用正确的方法顺序(首先是 sortByDesc()
,然后是 slice()
,然后是 take()
),但这是效率极低,因为您必须处理数据库中的每个 Product
。
您可能打算让数据库处理偏移量并跳过和排序,而不是提取所有可能的记录,然后只获取您想要的,然后对它们进行排序...如果您打算按自己的方式进行顺便说一句,在你跳过并采取之前需要排序。
使用数据库进行过滤和排序:
$products = Product::skip($request->input('offset'))
->take($request->input('limit'))
->orderBy('id', 'desc')
->get();
我正在尝试获取所有最新项目并按 id 降序排序(即获取所有刚刚添加的具有限制和偏移量的项目)。
所以我这样做了:
$products = Product::all()
->slice($request->get('offset'))
->take($request->get('limit'))
->sortByDesc('id')
->toBase();
然而,似乎当我有更多的限制时,我就没有正确的顺序。它让我说 10 种产品,但没有分类更正。知道如何使用 Eloquent ORM 做到这一点吗?
我认为问题是您首先使用 ::all()
,returns Product
个 Collection
中的所有实例,然后使用收集方法。由于这些方法按使用顺序起作用,因此您在排序之前先进行切片和偏移,因此每次都会得到相同的产品。使用正确的 Builder
语法来正确且更有效地处理此问题:
$products = Product::offset($request->input("offset"))
->limit($request->input("limit"))
->orderBy("id", "DESC")
->get();
因为这是一个 Builder
实例,查询将根据数据库的语法逻辑在单个查询中编译和执行。使用 Collection
逻辑没有错,您只需要使用正确的方法顺序(首先是 sortByDesc()
,然后是 slice()
,然后是 take()
),但这是效率极低,因为您必须处理数据库中的每个 Product
。
您可能打算让数据库处理偏移量并跳过和排序,而不是提取所有可能的记录,然后只获取您想要的,然后对它们进行排序...如果您打算按自己的方式进行顺便说一句,在你跳过并采取之前需要排序。
使用数据库进行过滤和排序:
$products = Product::skip($request->input('offset'))
->take($request->input('limit'))
->orderBy('id', 'desc')
->get();