Ordonare dupa suma - Laravel

Salut baieti!
Am un array care functioneaza ok, dar eu vreau sa ii ordonez dupa suma platita de ei!

$customer = Customer::where('client_id', Auth::user()->client_id)
->with('orders')
->get();

Functia “orders” din modelul Customer:

public function orders()
    {
        return $this->hasMany(Order::class);
    }

orders (este o functie in modelul Customer de unde iau comenzile lor) = este un array, 1 array pt fiecare comanda. Fiecare comanda are variabila numita total care este suma, eu trebuie sa adun acele totaluri pt toate comenzile existente ale unui user si in functie de rezultat, sa ii ordonez dupa suma calculata.
N-am idee cum as putea sa fac asta…
Multumesc!

Fascinant in ce complicatii pot intra ORM-urile doar pentru a evita SQL-ul. :smiley:

7 Likes
SELECT
 client_id,
 SUM(total) as totalClientSum
FROM
 orders
GROUP BY
 client_id
ORDER BY
 totalClientSum

?

2 Likes

Era literally la un google search distanță, a durat 0,5 secunde:

2 Likes

Multumesc pt fiecare raspuns tuturor!
Dar, cum folosesc orderBy acum sa-mi ordoneze in functie de rezultat? Am incercat cu ->orderBy('sum('orders.total')') dar fara efect…
Functia arata acum asa:

$customer = Customer::where('client_id', Auth::user()->client_id)
            ->with(['orders' => function($query){
               $query->sum('total');
            }])->get();

Mai infige si un where acolo :wink:

Păi rezultatul unui SUM nu aparține de nici un tabel, de ce ai face order by tabel.total?
Faci order după coloana de SUM. Ca să-ți faci viața mai ușoară alocă-i o denumire mai simplă rezultatului și apoi poți face order. (sum(total) as sum_total de ex)

Ca să știi să folosești un ORM e bine să înțelegi SQL-ul din spate…ajută mult.

1 Like

Inteleg… insa, in acel Query pe care l-am postat nu vad cum as putea sa folosesc "sum(total) as sum_total ", daca poti sa-mi lasi un exemplu ceva, multumesc oricum pt ajutor.

Incearca asa:

$customers = Customer::addSelect(['orders_sum' => Order::selectRaw('sum(total) as total')
         ->whereColumn('customer_id', 'customers.id')
         ->groupBy('customer_id')
     ])
     ->orderBy('orders_sum', 'DESC')
     ->get();

ce poate fi mai misto decat sa faci un subquery pt fiecare customer?

Laravel are documentație pentru a folosi selecție manuală.

Dacă era o problemă mai complicată înțelegeam dar practic e vorba de a caută cum a selecta coloane in plus cu eloquent și cum a folosi DB::Raw.

In plus, aici dacă ai nevoie pe termen lung ai putea stoca suma aia in model direct când se termină comanda.

E o optimizare mai extremă dar dacă ai câteva sute de mii sau milioane poate fi mai rapid decât să faci SUM la fiecare refresh de pagină.

Depinde însă de la caz la caz.

Salut @Ekors

Nu sunt familiar cu Laravel si orm-ul lui, dar poate merge urmatoarea varianta

$customer = DB::table('table_name')
                          ->select(DB::raw('col1, col2, sum(col_paid) as total'))
                          ->where('client_id', '==', Auth::user()->client_id) // atentie aici!!
                          ->groupBy('total')
                          ->orderBy('total', 'desc')

Este si mai usor de inteles pt ca seamana cu sql. Nu am facut nimic mai mult, decat sa transcriu query-ul lui @RedGuard. Si ceva imi spune ca nu se face niciun subquery. Sau daca se face, nu vad eu unde.

Este bine ca prima data sa incerci un query pe baza cu sql si apoi sa incerci sa il transcrii in aplicatie. Atentie la acel where. Ai grija cum iti vine acel client_id. :wink:


1 Like

Exact, era banal.