搜尋

首頁  >  問答  >  主體

如何依價格升序排序產品

<p>如何依價格升序對產品進行排序。價格是根據以下方式計​​算的:從模型Products中獲得的價格乘以從模型Pack中獲得的體積。這是在Laravel上顯示所有產品價格的方式。 </p> <pre class="brush:php;toolbar:false;">ceil( ( $product->packs->count() > 0 ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1 ) * $product->price )</pre> <p>我嘗試使用這段程式碼,但出現了錯誤。 </p> <blockquote> <p>Undefined property: IlluminateDatabaseQueryBuilder::$pack</p> </blockquote> <pre class="lang-php prettyprint-override"><code>if ($request->get('sort') == 'sort-price_desc') { $products = Product::orderBy( function ($product) { return ceil( ($product->packs->count() > 0 ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1) * $product->price ); } )->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 天前658

全部回覆(1)我來回復

  • P粉928591383

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

    此程式碼首先檢索所有產品及其關聯的包裝。然後,根據您提供的計算,在記憶體中對集合進行排序。

    回覆
    0
  • 取消回覆