Home > Software design >  how to apply sortBy for two columns. in laravel eloquent
how to apply sortBy for two columns. in laravel eloquent

Time:04-22

my product table contains these datas

id name price discounted_price

I want to apply sorting to table product using laravel eloquent. the discounted_price is 0 then sorting apply to price. discounted_price not 0 then sorting apply to discounted_price.

CodePudding user response:

You can simply retrieve all items using Eloquent get() method. After that, iterate through the collection and at each iteration, check if the discounted_price is != 0. If the condition is true, simply append a new item called final_price to the collection, with the value of discounted_price. Else, append the final_price with the price.

Finally, use sortBy() method to sort the collection by the final_price

        $products = Product::get();

        foreach($products as $product) {
            if($product->discounted_price != 0) {
                $product->final_price = $product->discounted_price;
            } else {
                $product->final_price = $product->price;
            }
        }

        return $products->sortBy(['final_price','asc']);

Further reference on collections sorting - https://laravel.com/docs/9.x/collections#method-sortby

CodePudding user response:

You can do this :

$products = Product::all();

return $products->map(function ($product) {
    $isDiscountPrice      = $product->discounted_price !== 0;
    $product->final_price = $product->{$isDiscountPrice ? 'discounted_price' : 'price'};
    return $product;
})->sortBy(['final_price','asc']);

In this situation, map() Laravel Collection would be a good solution !

  • Related