Pracowałem nad aplikacją Shoppingcart i teraz doszedłem do następującego problemu.
Jest Użytkownik, Produkt i Obiekt Koszyk.
- Tabela Cart zawiera tylko następujące kolumny: „id”, „user_id”, „product_id” i timestamps.
- Model użytkownika „hasMany” Carts (ponieważ użytkownik może przechowywać wiele produktów).
- CartModel „nalezy do” użytkownika i CartModel „hasMany” produktów.
Teraz do obliczenia całkowitej produkty mogę po prostu zadzwonić: Auth::user()->cart()->count()
.
Moje pytanie brzmi: Jak uzyskać SUMA () cen (kolumna produktu) produktów w koszyku tego Użytkownika?
Chciałbym to osiągnąć za pomocą Eloquent, a nie za pomocą zapytania (głównie dlatego, że uważam, że jest o wiele czystsze).
$sum = Auth::user()->cart()->products()->sum('price');
lub cokolwiek w kolumnie ceny znajduje się w tabeli produktów.products->sum
sugeruje, że jest to suma wywołań na obiekcie kolekcji, a nie na obiekcie konstruktora zwracanym przez products (). Warto wyjaśnić, który z nich masz na myśli, i najlepiej podać link, aby wyjaśnić oba....->products->...
wyśle zapytanie do bazy danych, aby pobrać wszystkie produkty powiązane z bieżącym modelem, a następnie będzie pracować z tą kolekcją w pamięci. Użycie...->products()->...
po prostu modyfikuje budowane zapytanie bez wykonywania go, dopóki nie->sum()
zostanie wywołane coś takiego, co może być bardziej wydajne, ponieważ pozwala uniknąć przesyłania niepotrzebnych informacji z bazy danych do pamięci.to nie jest twoja odpowiedź, ale dla tych, którzy przyjeżdżają tutaj, szukając rozwiązania innego problemu. Chciałem warunkowo uzyskać sumę kolumny powiązanej tabeli. W mojej bazie danych umowy zawiera wiele działań. Chciałem uzyskać sumę „suma_kwoty” z tabeli Działania, gdzie działania.deal_id = deal.id i działania.status = zapłacone, więc zrobiłem to.
wraca
w atrybucie okazji.
To jest teraz suma, której chciałem nie liczyć.
źródło
Próbowałem zrobić coś podobnego, co zajęło mi dużo czasu, zanim mogłem rozgryźć funkcję collect (). Więc możesz mieć coś w ten sposób:
collect($items)->sum('amount');
To daje sumę wszystkich pozycji.
źródło
collect()
collect()
służy do wzbogacenia tablicy w obiekt kolekcji, ale jeśli nie masz kolekcji w pierwszej kolejności, może być lepiej użyć po prostu tablicy surowejRównież za pomocą konstruktora zapytań
Aby uzyskać podsumowanie wszystkich wartości stawek wewnątrz stawek tabeli.
Aby uzyskać podsumowanie produktów użytkownika.
źródło