商品を価格の安い順に並べ替える方法。価格は、モデル製品から取得した価格にモデル パックから取得した容量を乗じて計算されます。 Laravel上で全商品の価格を表示する方法です。
ceil( ( $製品->パック->カウント() > 0 ? $product->packs->sortBy('pivot.add_time')->first()->volume :1 ) * $product->price )
このコードを使用しようとしましたが、エラーが発生しました。
<ブロック引用>未定義のプロパティ: IlluminateDatabaseQueryBuilder::$pack
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(); }
Laravel の Eloquent ORM の orderBy メソッドはクロージャー関数の代替をサポートしていないため、コードは正しくありません。代わりに、列名とソート方向 (昇順または降順) を引数として期待します。このシナリオでは、少し複雑な計算値に基づいて製品を並べ替えようとしていますが、これは orderBy を使用して直接達成することはできません。
採用できる戦略の 1 つは、このフィールドを事前に計算して製品テーブルに保存し、このフィールドで並べ替えることです。あるいは、最初に製品を取得してからメモリ内で並べ替えることもできます。
メモリ内でこれを行う方法は次のとおりです:
リーリーこのコードは、最初にすべての製品とその関連パッケージを取得します。次に、指定した計算に基づいてコレクションがメモリ内で並べ替えられます。