can't use paginate when use sortby in Laravel

丶灬走出姿态 提交于 2020-02-04 01:54:06

问题


I Want to get products and sort it by mutator attribute in my case it's called price

i search for how to sort it and found that i can use sortBy from the collection

like that

private function search()
{   
    return Product::with(['firstImage', 'category'])
        ->sortBy('price');
}

it works fine, but when I try to add paginate nothing happens and there is no paginate in the response

private function search()
{   
    return Product::with(['firstImage', 'category'])
        ->paginate(9)->sortBy('price');

}

So how can i add paginate in this case?

Edit

price mutator

public function getPriceAttribute()
{
    return $this->sell_price - (($this->discount * $this->sell_price) / 100);
}

回答1:


Unfortunately there is no way to call paginate() on collection. You may manually paginate the collection result or modify your query and use addSelect or orderByRaw to include mutated value:

use Illuminate\Support\Facades\DB;

Product::select('*', DB::raw('(sell_price - ((discount * sell_price) / 100)) AS price'))
        ->orderBy('price')
        ->paginate(9);

By the way, I think you'll get the same result to order by sell_price column instead of price mutated value if your discount is a constant value, so try orderBy('sell_price') instead of sortBy('price'):

Product::with(['firstImage', 'category'])
        ->orderBy('sell_price')
        ->paginate(9);

Laravel Docs: https://laravel.com/docs/master/queries#ordering-grouping-limit-and-offset




回答2:


You must use paginate(9) after sortBy() function. So you must edit second code like this :

private function search()
{   
    return Product::with(['firstImage', 'category'])
        ->sortBy('price')->paginate(9);

}


来源:https://stackoverflow.com/questions/59708229/cant-use-paginate-when-use-sortby-in-laravel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!