我希望使用Eloquent创建产品筛选器。
我从以下方式开始:
$query = Product::whereHas('variants')
->with('variants')
->with('reviews')
$query = $this->addOrderConstraints($request, $query);
$products = $query->paginate(20);
在哪里
private function addOrderConstraints($request, $query)
{
$order = $request->input('sort');
if ($order === 'new') {
$query->orderBy('products.created_at', 'DESC');
}
if ($order === 'price') {
$query->orderBy('variants.price', 'ASC');
}
return $query;
}
然而,这样做不起作用,因为Eloquent执行的查询如下所示(来自Laravel DebugBar的信息):
select count(*) as aggregate from `products` where exists
(select * from `variants` where `products`.`id` = `variants`.`product_id`)
select * from `products` where exists
(select * from `variants` where `products`.`id` = `variants`.`product_id`)
select * from `variants` where `variants`.`product_id` in ('29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
我尝试按价格排序时,出现了明显的错误。
等等,还有其他问题。
Unknown column 'variants.price' in 'order clause' (SQL: select * from
`products` where exists (select * from `variants` where `products`.`id` =
能否使用Eloquent进行关联排序呢?
通过使用variants.product_id
,按variants.price
升序排列,取前20条数据(偏移量为0)。
所以,它是否可以执行关系排序呢?
$query->orderByRaw('variants.price asc');
。 - Casper Spruit