Rumah > Soal Jawab > teks badan
P粉9285913832023-08-01 00:26:47
Oleh kerana kaedah orderBy ORM Eloquent Laravel tidak menyokong fungsi penutupan sebagai pengganti, kod tersebut tidak betul. Sebaliknya, ia mengharapkan nama lajur dan arah isihan (menaik atau menurun) sebagai argumen. Dalam senario anda, anda cuba mengisih produk berdasarkan nilai terkira yang sedikit kompleks, yang tidak boleh dicapai secara langsung dengan menggunakan orderBy.
Satu strategi yang boleh anda pakai ialah mengira medan ini terlebih dahulu dan menyimpannya dalam jadual produk, kemudian mengisih mengikut medan ini. Sebagai alternatif, anda boleh mendapatkan semula produk dahulu dan kemudian menyusunnya dalam ingatan.
Begini cara anda boleh melakukannya dalam ingatan:
$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(); }
Kod ini mula-mula mendapatkan semula semua produk dan pembungkusan yang berkaitan dengannya. Koleksi itu kemudiannya diisih dalam ingatan berdasarkan pengiraan yang anda berikan.