商品を価格の安い順に並べ替える方法
P粉781235689
2023-07-31 13:29:25
<p>商品を価格の安い順に並べ替える方法。価格は、モデル製品から取得した価格にモデル パックから取得した容量を乗じて計算されます。 Laravel上で全商品の価格を表示する方法です。 </p>
<pre class="brush:php;toolbar:false;">ceil(
(
$製品->パック->カウント() > 0
? $product->packs->sortBy('pivot.add_time')->first()->volume
:1
) * $product->price
)</pre>
<p>このコードを使用しようとしましたが、エラーが発生しました。 </p>
<ブロック引用>
<p>未定義のプロパティ: IlluminateDatabaseQueryBuilder::$pack</p>
</blockquote>
<pre class="lang-php prettyprint-override"><code>if ($request->get('sort') == 'sort-price_desc') {
$products = 製品::orderBy(
関数 ($product) {
天井を返す(
($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 を使用して直接達成することはできません。
採用できる戦略の 1 つは、このフィールドを事前に計算して製品テーブルに保存し、このフィールドで並べ替えることです。あるいは、最初に製品を取得してからメモリ内で並べ替えることもできます。
メモリ内でこれを行う方法は次のとおりです:
リーリーこのコードは、最初にすべての製品とその関連パッケージを取得します。次に、指定した計算に基づいてコレクションがメモリ内で並べ替えられます。