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(); }
此程式碼首先檢索所有產品及其關聯的包裝。然後,根據您提供的計算,在記憶體中對集合進行排序。