Jumlah Laravel Eloquent dari kolom relasi

111

Saya telah mengerjakan aplikasi kereta belanja dan sekarang saya sampai pada masalah berikut ..

Ada pengguna, Produk, dan objek Keranjang.
- Tabel Keranjang hanya berisi kolom berikut: "id", "user_id", "product_id", dan cap waktu.
- Gerobak "hasMany" UserModel (karena pengguna dapat menyimpan banyak produk).
- Produk CartModel "milikTo" Pengguna dan CartModel "hasMany".

Sekarang untuk menghitung total produk saya hanya bisa menelepon: Auth::user()->cart()->count().

Pertanyaan saya adalah: Bagaimana saya bisa mendapatkan JUMLAH () dari harga (kolom produk) dari produk di keranjang oleh Pengguna ini?
Saya ingin menyelesaikan ini dengan Eloquent dan bukan dengan menggunakan kueri (terutama karena saya yakin ini jauh lebih bersih).

laksamana
sumber

Jawaban:

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

Dokumentasi ini sedikit menjelaskan beberapa Collectionmetode tetapi semua agregat pembuat kueri tampaknya tersedia selain avg()yang dapat ditemukan di http://laravel.com/docs/queries#aggregates .

pengguna1669496
sumber
wow terima kasih untuk balasan cepat itu. Sekarang hanya dikatakan tidak ada kolom harga. Sepertinya fasih sama sekali tidak melihat tabel Produk itu ....
theAdmiral
3
Sebenarnya masuk akal, Anda harus menambahkan tabel produk ke hubungan tersebut, maaf. Coba $sum = Auth::user()->cart()->products()->sum('price');atau berapapun kolom harga yang ada di tabel produk Anda.
pengguna1669496
1
Itu berhasil untuk saya! Saya berhenti menggunakan cartclass. Baik Pengguna dan produk sekarang memiliki metode kepemilikanToMany (). Sekarang saya bisa menggunakan price: {{Auth :: user () -> products-> sum ('price')}} Thanx, Kasus ini sudah terpecahkan.
theAdmiral
9
Ada yang tidak beres di sini - tautan Anda mengacu pada penerapan fungsi agregat ke kueri database, tetapi products->summenyiratkan bahwa ini adalah panggilan jumlah pada objek koleksi, bukan pada objek pembuat yang dikembalikan oleh products (). Perlu diperjelas mana yang Anda maksud di sini, dan idealnya berikan tautan untuk menjelaskan keduanya.
Benubird
1
@ user3253002 menggunakan hubungan tanpa tanda kurung ...->products->...akan meminta database untuk mendapatkan semua produk terkait model saat ini dan kemudian bekerja dengan koleksi dalam memori tersebut. Menggunakan ...->products()->...just memodifikasi kueri yang sedang dibangun tanpa menjalankannya sampai sesuatu seperti ->sum()dipanggil. Yang terakhir bisa lebih efisien, karena menghindari transfer informasi yang tidak perlu dari database ke dalam memori.
Siegen
62

ini bukan jawaban Anda tetapi untuk mereka yang datang ke sini mencari solusi untuk masalah lain. Saya ingin mendapatkan jumlah kolom tabel terkait secara kondisional. Dalam database saya Deals memiliki banyak Aktivitas, saya ingin mendapatkan jumlah "jumlah_total" dari tabel Aktivitas di mana aktivitas.deal_id = deal.id dan aktivitas.status = dibayar jadi saya melakukan ini.

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

itu kembali

"paid_sum_count" => "320.00"

di atribut Deals.

Ini sekarang jumlah yang ingin saya dapatkan bukan hitungan.

ahmad ali
sumber
4
Ini adalah yang terbaik dalam banyak kasus karena Anda dapat mengurutkannya tanpa harus mendapatkan semua catatan.
Sabrina Leggett
15

Saya mencoba melakukan hal serupa, yang membutuhkan banyak waktu sebelum saya dapat mengetahui fungsi collect (). Jadi Anda bisa mendapatkan sesuatu dengan cara ini:

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

Ini akan memberi Anda jumlah total semua item.

Abdur Rahman Turawa
sumber
4
nama fungsinya sebenarnyacollect()
Leonardo Beal
Anda mungkin lebih baik hanya mengulang array. collect()digunakan untuk memperkaya array ke dalam objek koleksi, tetapi jika Anda tidak memiliki koleksi di tempat pertama, mungkin lebih baik menggunakan array mentah
Flame
0

Juga menggunakan pembuat kueri

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

Untuk mendapatkan penjumlahan dari semua nilai tarif di dalam tabel tarif.

Untuk mendapatkan penjumlahan produk pengguna.

DB::table("users")->get()->sum("products")
Ahmed Mahmoud
sumber