php 如何按价格升序排列产品

wlp8pajw  于 2023-08-02  发布在  PHP
关注(0)|答案(1)|浏览(128)

如何按价格升序排列产品。价格创建如下:价格从模型产品乘以体积从模型包。这是Laravel上所有产品的价格显示方式

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

字符串
我试着使用这个代码,但错误
未定义属性:Illuminate\Database\Query\Builder::$pack

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

tktrz96b

tktrz96b1#

代码不正确,因为Laravel的Eloquent ORM的orderBy方法没有提供闭包函数作为替代。相反,它预期列名和排序方向(asc或desc)作为参数。在您的场景中,您试图根据计算值对产品进行排序,这稍微复杂一些,不能直接使用orderBy来完成。
您可以采用的策略是预先计算该字段并将其存储在products表中,然后按此进行排序。或者,您可以首先检索产品,然后在内存中对其进行排序。
下面是你在内存中如何做的:

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

字符串
此代码首先检索所有产品沿着关联的包。然后,它根据您提供的计算对内存中的集合进行排序。

相关问题