Heim > Fragen und Antworten > Hauptteil
P粉9285913832023-08-01 00:26:47
由于Laravel的Eloquent ORM的orderBy方法不支持闭包函数作为替代,所以代码是不正确的。相反,它预期将列名和排序方向(升序或降序)作为参数。在您的场景中,您尝试根据一个稍微复杂的计算值对产品进行排序,这不能直接通过使用orderBy来实现。
您可以采用的一种策略是事先计算这个字段并将其存储在产品表中,然后按照该字段进行排序。或者,您可以先检索产品,然后在内存中对它们进行排序。
以下是您可能在内存中执行的方式:
$products = Product::with('packs')->get(); $products = $products->sort(function ($a, $b) { $aVolume = $a->packs->count() > 0 ? $a->packs->sortBy('pivot.add_time')->first()->volume : 1; $bVolume = $b->packs->count() > 0 ? $b->packs->sortBy('pivot.add_time')->first()->volume : 1; $aPrice = ceil($aVolume * $a->price); $bPrice = ceil($bVolume * $b->price); if ($aPrice == $bPrice) { return 0; } return $aPrice < $bPrice ? -1 : 1; }); if ($request->get('sort') == 'sort-price_desc') { $products = $products->reverse(); }
此代码首先检索所有产品及其关联的包装。然后,根据您提供的计算,在内存中对集合进行排序。