Maison > Questions et réponses > le corps du texte
P粉9285913832023-08-01 00:26:47
Étant donné que la méthode orderBy de l'ORM Eloquent de Laravel ne prend pas en charge les fonctions de fermeture en remplacement, le code est incorrect. Au lieu de cela, il attend le nom de la colonne et le sens du tri (ascendant ou décroissant) comme arguments. Dans votre scénario, vous essayez de trier les produits en fonction d'une valeur calculée légèrement complexe, ce qui ne peut pas être réalisé directement en utilisant orderBy.
Une stratégie que vous pouvez adopter est de calculer ce champ au préalable et de le stocker dans la table des produits, puis de trier selon ce champ. Alternativement, vous pouvez d'abord récupérer les produits, puis les trier en mémoire.
Voici comment procéder en mémoire :
$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(); }
Ce code récupère dans un premier temps tous les produits et leurs emballages associés. La collection est ensuite triée en mémoire en fonction du calcul que vous fournissez.