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).

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 .


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.


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.


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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.