So sortieren Sie Produkte nach Preis in aufsteigender Reihenfolge
P粉781235689
P粉781235689 2023-07-31 13:29:25
0
1
569

So sortieren Sie Produkte nach Preis in aufsteigender Reihenfolge. Der Preis wird auf der Grundlage des Preises aus den Modellprodukten multipliziert mit dem Volumen aus dem Modellpaket berechnet. So zeigen Sie alle Produktpreise auf Laravel an.

ceil( ( $product->packs->count() > ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1 ) * $product->price )

Ich habe versucht, diesen Code zu verwenden, habe aber eine Fehlermeldung erhalten.

Undefinierte Eigenschaft: IlluminateDatabaseQueryBuilder::$pack

if ($request->get('sort') == 'sort-price_desc') { $products = Product::orderBy( Funktion ($produkt) { Rückkehrdecke( ($product->packs->count() > 0 ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1) * $Produkt->Preis ); } )->get(); }/span> 


P粉781235689
P粉781235689

Antworte allen (1)
P粉928591383

由于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(); }

此代码首先检索所有产品及其关联的包装。然后,根据您提供的计算,在内存中对集合进行排序。

    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!