recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment trier les produits par prix par ordre croissant

<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粉781235689P粉781235689500 Il y a quelques jours656

répondre à tous(1)je répondrai

  • P粉928591383

    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.

    répondre
    0
  • Annulerrépondre