How to order by using appended attribute in Laravel

后端 未结 5 1051
南旧
南旧 2021-02-13 19:05

I created an appends attribute in Laravel Model, from the code below.

    protected $appends = array(\'total\'=>\'\');

And I set the returne

相关标签:
5条回答
  • 2021-02-13 19:39

    use sortBy for ASC

    $collection->sortBy('field');
    

    use sortByDesc for DESC

    $collection->sortByDesc('field');
    
    0 讨论(0)
  • 2021-02-13 19:50

    If working with attributes those are not always available instantly (e.g. for freshly created models).

    As expansion on Ayobami Opeyemi's answer you should be able to use Collection's sortBy if you force the attribute to evaluate by calling its function directly:

    $products = Product::all();
    $products = $products->sortBy(function($product){
        return $product->getTotalAttribute();
    });
    

    https://laravel.com/docs/master/collections#method-sortby

    0 讨论(0)
  • 2021-02-13 19:52

    the orderBy takes an actual database field not an appended one

    try this

    $products = Product::all();
    $products = $products->sortBy(function($product){
        return $product->total;
    });
    
    0 讨论(0)
  • 2021-02-13 19:54

    You can use the sortBy method from collections.

    $products = Product::all();
    $products = $products->sortBy('total');
    
    0 讨论(0)
  • 2021-02-13 19:58

    As mentioned, the proposed solution using a sortBy() callback does not work with paging.
    Here is an alternative to the accepted solution:

    orderByRaw()

    If the appended attributes can be calculated from the fields in your query you can instead use orderByRaw(), like so:

    // For example, booking percentage
    $query->orderByRaw('bookings_count / total_count');
    

    Check out a more advanced example here: laravel orderByRaw() on the query builder

    0 讨论(0)
提交回复
热议问题