Laravel Eloquent İlişkinin sütununun toplamı


111

Bir alışveriş arabası uygulaması üzerinde çalışıyorum ve şimdi şu konuya geldim ..

Bir Kullanıcı, Ürün ve Alışveriş Sepeti nesnesi var.
- Alışveriş Sepeti tablosu yalnızca şu sütunları içerir: "id", "user_id", "product_id" ve zaman damgaları.
- UserModel "hasMany" Carts (çünkü bir kullanıcı birden fazla ürünü depolayabilir).
- CartModel "bir Kullanıcıya aittir ve CartModel" Birçok "Ürüne sahiptir.

Şimdi sadece çağırabilir toplam ürünlerini hesaplamak için: Auth::user()->cart()->count().

Sorum şu: Bu Kullanıcı tarafından alışveriş sepetindeki ürünlerin toplam fiyatını (ürün sütunu) nasıl alabilirim?
Bunu Eloquent ile başarmak istiyorum ve sorgu kullanarak değil (çünkü bunun çok daha temiz olduğuna inanıyorum).

Yanıtlar:


220
Auth::user()->products->sum('price');

Belgeler, bazı Collectionyöntemler için biraz hafiftir, ancak tüm sorgu oluşturucu kümeleri avg(), http://laravel.com/docs/queries#aggregates adresinde bulunabilenlerin yanı sıra görünüşte mevcuttur .


hızlı cevap için vay canına teşekkürler. Şimdi sadece fiyat sütunu olmadığını söylüyor. Görünüşe göre belagat o Ürün masasına hiç
bakmıyor

3
Aslında mantıklı, ürünler tablosunu ilişkiye eklemelisiniz, üzgünüm. Deneyin $sum = Auth::user()->cart()->products()->sum('price');veya ürünler tablonuzdaki fiyat sütunu neyse.
user1669496

1
Bu benim için çalıştı! Araba sınıflarını kullanmayı bıraktım. Hem Kullanıcı hem de ürün artık bir OwnToMany () yöntemine sahiptir. Şimdi fiyatı kullanabiliyorum: {{Auth :: user () -> products-> sum ('price')}} Thanx, Bu durum çözüldü.
theAdmiral

9
Burada tam olarak doğru olmayan bir şey var - bağlantınız, veritabanı sorgularına toplama işlevlerini uygulamayı ifade ediyor, ancak products->sumbunun products () tarafından döndürülen oluşturucu nesnesi yerine bir koleksiyon nesnesinde çağrı toplamı olduğunu ima ediyor. Burada hangisini kastettiğinizi açıklamaya değer ve ideal olarak her ikisini de açıklamak için bir bağlantı sağlayın.
Benubird

1
@ user3253002 parantez içermeyen bir ilişki kullanmak ...->products->..., mevcut modelin tüm ilgili ürünlerini almak için veritabanını sorgulayacak ve ardından bu bellek içi koleksiyonla çalışacaktır. ...->products()->...Sadece kullanmak , böyle bir ->sum()şey çağrılıncaya kadar çalıştırılmadan yapılan sorguyu değiştirir. İkincisi, gereksiz bilgilerin veritabanından belleğe aktarılmasını önlediği için daha verimli olabilir.
Siegen

62

bu senin cevabın değil ama buraya gelip başka bir soruna çözüm arayanlar içindir. Koşullu olarak ilgili tablodaki bir sütunun toplamını almak istedim. Veritabanımda Anlaşmalar birçok Aktivite var Aktiviteler tablosundan "amount_total" toplamını almak istedim, burada Activities.deal_id = deal.id ve Activities.status = ödendi, bu yüzden bunu yaptım.

$query->withCount([
'activity AS paid_sum' => function ($query) {
            $query->select(DB::raw("SUM(amount_total) as paidsum"))->where('status', 'paid');
        }
    ]);

geri döner

"paid_sum_count" => "320.00"

Fırsatlar özniteliğinde.

Bu, şimdi almak istediğim toplam sayı değil.


4
Bu, çoğu durumda en iyisidir, çünkü tüm kayıtları almak zorunda kalmadan ona göre sıralayabilirsiniz.
Sabrina Leggett

15

Benzer bir şey yapmayı denedim, bu da Collect () işlevini çözebilmem için çok zamanımı aldı. Böylece şu şekilde bir şeye sahip olabilirsiniz:

collect($items)->sum('amount');

Bu size tüm öğelerin toplamını verecektir.


4
işlevin adı aslındacollect()
Leonardo Beal

diziyi döngüye sokmanız muhtemelen daha iyidir. collect()bir diziyi bir koleksiyon nesnesine zenginleştirmek için kullanılır, ancak ilk etapta bir koleksiyonunuz yoksa sadece ham diziyi kullanmak daha iyi olabilir
Flame

0

Ayrıca sorgu oluşturucu kullanılıyor

DB::table("rates")->get()->sum("rate_value")

Tablo oranları içindeki tüm oran değerlerinin toplamını almak için.

Kullanıcı ürünlerinin özetini almak için.

DB::table("users")->get()->sum("products")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.