如何按照价格升序排序产品
P粉781235689
P粉781235689 2023-07-31 13:29:25
[PHP讨论组]
<p>如何按价格升序对产品进行排序。价格是根据以下方式计算的:从模型Products中获取的价格乘以从模型Pack中获取的体积。这是在Laravel上显示所有产品价格的方式。</p> <pre class="brush:php;toolbar:false;">ceil( ( $product-&gt;packs-&gt;count() &gt; 0 ? $product-&gt;packs-&gt;sortBy('pivot.add_time')-&gt;first()-&gt;volume : 1 ) * $product-&gt;price )</pre> <p>我尝试使用这段代码,但出现了错误。</p> <blockquote> <p>Undefined property: IlluminateDatabaseQueryBuilder::$pack</p> </blockquote> <pre class="lang-php prettyprint-override"><code>if ($request-&gt;get('sort') == 'sort-price_desc') { $products = Product::orderBy( function ($product) { return ceil( ($product-&gt;packs-&gt;count() &gt; 0 ? $product-&gt;packs-&gt;sortBy('pivot.add_time')-&gt;first()-&gt;volume : 1) * $product-&gt;price ); } )-&gt;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

全部回复(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();
}

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号