如何按照价格升序排序产品
P粉781235689
2023-07-31 13:29:25
<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>
由于Laravel的Eloquent ORM的orderBy方法不支持闭包函数作为替代,所以代码是不正确的。相反,它预期将列名和排序方向(升序或降序)作为参数。在您的场景中,您尝试根据一个稍微复杂的计算值对产品进行排序,这不能直接通过使用orderBy来实现。
您可以采用的一种策略是事先计算这个字段并将其存储在产品表中,然后按照该字段进行排序。或者,您可以先检索产品,然后在内存中对它们进行排序。
以下是您可能在内存中执行的方式:
此代码首先检索所有产品及其关联的包装。然后,根据您提供的计算,在内存中对集合进行排序。