Ich habe an einer Shoppingcart-Anwendung gearbeitet und bin jetzt zu folgendem Problem gekommen.
Es gibt einen Benutzer, ein Produkt und ein Warenkorbobjekt.
- Die Cart-Tabelle enthält nur die folgenden Spalten: "id", "user_id", "product_id" und Zeitstempel.
- Das UserModel "hasMany" Carts (da ein Benutzer mehrere Produkte speichern kann).
- Das CartModel "gehört einem Benutzer" und das CartModel "hat viele" Produkte.
Um nun die Gesamtmenge der Produkte zu berechnen, kann ich einfach anrufen : Auth::user()->cart()->count()
.
Meine Frage ist: Wie kann ich die Summe () der Preise (eine Produktspalte) der Produkte im Warenkorb von diesem Benutzer erhalten?
Ich möchte dies mit Eloquent erreichen und nicht mit einer Abfrage (hauptsächlich, weil ich glaube, dass es viel sauberer ist).
$sum = Auth::user()->cart()->products()->sum('price');
oder was auch immer die Preisspalte auf Ihrer Produkttabelle ist.products->sum
impliziert jedoch , dass es sich um eine Aufrufsumme für ein Auflistungsobjekt handelt und nicht für das von products () zurückgegebene Builder-Objekt. Es lohnt sich zu klären, welche Sie hier meinen, und im Idealfall einen Link bereitzustellen, um beide zu erklären....->products->...
die Datenbank ab, um alle zugehörigen Produkte des aktuellen Modells abzurufen, und arbeitet dann mit dieser In-Memory-Sammlung. Wenn Sie...->products()->...
nur verwenden, wird die Abfrage->sum()
geändert , ohne sie auszuführen, bis so etwas wie aufgerufen wird. Letzteres kann effizienter sein, da unnötige Informationen aus der Datenbank nicht in den Speicher übertragen werden.Dies ist nicht Ihre Antwort, sondern für diejenigen, die hierher kommen und nach einer Lösung für ein anderes Problem suchen. Ich wollte die Summe einer Spalte einer verwandten Tabelle bedingt erhalten. In meiner Datenbank hat Deals viele Aktivitäten. Ich wollte die Summe des "Betrags" aus der Tabelle "Aktivitäten" abrufen, in der activity.deal_id = deal.id und activity.status = bezahlt sind, also habe ich dies getan.
es kehrt zurück
im Deals-Attribut.
Dies ist nun die Summe, die ich nicht zählen wollte.
quelle
Ich habe versucht, etwas Ähnliches zu tun, was mich viel Zeit gekostet hat, bis ich die Funktion collect () herausgefunden habe. So können Sie etwas haben:
collect($items)->sum('amount');
Dies gibt Ihnen die Gesamtsumme aller Artikel.
quelle
collect()
collect()
wird verwendet, um ein Array in ein Sammlungsobjekt anzureichern. Wenn Sie jedoch überhaupt keine Sammlung haben, ist es möglicherweise besser, nur das Roh-Array zu verwendenVerwenden Sie auch den Abfrage-Generator
Um die Summe aller Tarifwerte innerhalb der Tabellensätze zu erhalten.
Um eine Zusammenfassung der Benutzerprodukte zu erhalten.
quelle