Cara mengisih produk mengikut harga dalam tertib menaik
P粉781235689
P粉781235689 2023-07-31 13:29:25
0
1
670
<p>Cara mengisih produk mengikut harga dalam tertib menaik. Harga dikira berdasarkan harga yang diambil daripada model Produk didarab dengan volum yang diambil daripada Pek model. Ini adalah cara untuk memaparkan semua harga produk pada Laravel. </p> <pre class="brush:php;toolbar:false;">ceil( ( $product->packs->count() > ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1 ) * $produk->harga )</pra> <p>Saya cuba menggunakan kod ini tetapi mendapat ralat. </p> <blockquote> <p>Sifat tidak ditentukan: IlluminateDatabaseQueryBuilder::$pack</p> </blockquote> <pre class="lang-php prettyprint-override"><code>if ($request->get('sort') == 'sort-price_desc') { $products = Produk::orderBy( fungsi ($produk) { kembali siling( ($produk->pek->count() > 0 ? $product->packs->sortBy('pivot.add_time')->first()->volume : 1) * $produk->harga ); } )->dapatkan(); }<span style="font-family:'sans serif, tahoma, verdana, helvetica';"><span style="white-space:nowrap;"> </code></pre> <p><br /></p>
P粉781235689
P粉781235689

membalas semua(1)
P粉928591383

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan