Comment trier les produits par prix par ordre croissant
P粉781235689
P粉781235689 2023-07-31 13:29:25
0
1
671
<p>Comment trier les produits par prix par ordre croissant. Le prix est calculé sur la base du prix issu des Produits modèles multiplié par le volume issu du Pack modèle. Voici comment afficher tous les prix des produits sur Laravel. </p> <pre class="brush:php;toolbar:false;">ceil( ( $produit->packs->count() > ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1 ) * $produit->prix )</pré> <p>J'ai essayé d'utiliser ce code mais j'ai obtenu une erreur. </p> <blockquote> <p>Propriété non définie : IlluminateDatabaseQueryBuilder::$pack</p> </blockquote> <pre class="lang-php Prettyprint-override"><code>if ($request->get('sort') == 'sort-price_desc') { $produits = Produit::orderBy( fonction ($produit) { plafond de retour ( ($produit->packs->count() > 0 ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1) * $produit->prix ); } )->get(); }<span style="font-family:'sans serif, tahoma, verdana, helvetica';"><span style="white-space:nowrap;"> </span></span> </code></pre> <p><br /></p>
P粉781235689
P粉781235689

répondre à tous(1)
P粉928591383

É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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal