Laravel Eloquent Sum của cột quan hệ


111

Tôi đang làm việc trên một ứng dụng mua sắm và bây giờ tôi đã đến vấn đề sau ..

Có Người dùng, Sản phẩm và đối tượng Giỏ hàng.
- Bảng Giỏ hàng chỉ chứa các cột sau: "id", "user_id", "product_id" và dấu thời gian.
- UserModel "hasMany" Carts (vì một người dùng có thể lưu trữ nhiều sản phẩm).
- CartModel "thuộc về" một Người dùng và CartModel "hasMany" Sản phẩm.

Bây giờ để tính toán tổng sản phẩm tôi chỉ có thể gọi: Auth::user()->cart()->count().

Câu hỏi của tôi là: Làm cách nào để lấy SUM () giá (một cột sản phẩm) của các sản phẩm trong giỏ hàng bởi Người dùng này?
Tôi muốn thực hiện điều này với Eloquent chứ không phải bằng cách sử dụng truy vấn (chủ yếu là vì tôi tin rằng nó sạch hơn rất nhiều).

Câu trả lời:


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

Tài liệu này hơi nhỏ cho một số Collectionphương pháp nhưng tất cả các tập hợp trình tạo truy vấn dường như có sẵn bên cạnh avg()đó bạn có thể tìm thấy tại http://laravel.com/docs/queries#aggregates .


wow, cảm ơn vì đã trả lời nhanh chóng. Nó bây giờ chỉ nói rằng không có cột giá. Có vẻ như người hùng hồn không nhìn vào bảng Sản phẩm đó chút nào ....
theAdmiral

3
Thực ra cũng có lý, bạn phải thêm bảng sản phẩm vào mối quan hệ, xin lỗi. Hãy thử $sum = Auth::user()->cart()->products()->sum('price');hoặc bất cứ điều gì cột giá trên bảng sản phẩm của bạn.
user1669496

1
Điều đó đã làm việc cho tôi! Tôi đã ngừng sử dụng các lớp học. Cả Người dùng và sản phẩm bây giờ đều có phương thức Thuộc vềToMany (). Bây giờ tôi có thể sử dụng price: {{Auth :: user () -> products-> sum ('price')}} Thanx, Trường hợp này đã được giải quyết.
theAdmiral

9
Có điều gì đó không ổn ở đây - liên kết của bạn đề cập đến việc áp dụng các hàm tổng hợp cho các truy vấn cơ sở dữ liệu, nhưng products->sumngụ ý rằng nó là gọi tổng trên một đối tượng bộ sưu tập, chứ không phải trên đối tượng trình tạo được trả về bởi các sản phẩm (). Bạn nên làm rõ ý của bạn ở đây và lý tưởng nhất là cung cấp một liên kết để giải thích cả hai.
Benubird

1
@ user3253002 sử dụng mối quan hệ không có dấu ngoặc đơn ...->products->...sẽ truy vấn cơ sở dữ liệu để lấy tất cả các sản phẩm liên quan của mô hình hiện tại và sau đó làm việc với bộ sưu tập trong bộ nhớ đó. Sử dụng ...->products()->...chỉ sửa đổi truy vấn đang được xây dựng mà không thực hiện nó cho đến khi một thứ gì đó giống như ->sum()được gọi. Cách sau có thể hiệu quả hơn, vì nó tránh chuyển thông tin không cần thiết từ cơ sở dữ liệu vào bộ nhớ.
Siegen

62

đây không phải là câu trả lời của bạn mà dành cho những người đến đây tìm kiếm giải pháp cho một vấn đề khác. Tôi muốn nhận tổng của một cột của bảng có liên quan theo điều kiện. Trong cơ sở dữ liệu của tôi Giao dịch có nhiều Hoạt động, tôi muốn lấy tổng "số tiền_tổng" từ bảng Hoạt động trong đó activity.deal_id = deal.id và activity.status = được trả tiền nên tôi đã làm điều này.

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

nó trở lại

"paid_sum_count" => "320.00"

trong thuộc tính Giao dịch.

Đây bây giờ nó là tổng mà tôi muốn nhận được không phải là số.


4
Điều này là tốt nhất trong nhiều trường hợp vì bạn có thể sắp xếp theo nó mà không cần phải lấy tất cả các bản ghi.
Sabrina Leggett

15

Tôi đã thử làm điều gì đó tương tự, điều này khiến tôi mất rất nhiều thời gian trước khi tôi có thể tìm ra hàm collect (). Vì vậy, bạn có thể có một cái gì đó theo cách này:

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

Điều này sẽ cung cấp cho bạn tổng cộng của tất cả các mục.


4
tên của hàm thực sự làcollect()
Leonardo Beal

có lẽ tốt hơn bạn chỉ nên lặp lại mảng. collect()được sử dụng để làm giàu cho một mảng vào một đối tượng thu, nhưng nếu bạn không có một bộ sưu tập ở nơi đầu tiên nó có thể là tốt hơn để chỉ cần sử dụng các mảng nguyên
Ngọn lửa

0

Cũng sử dụng trình tạo truy vấn

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

Để nhận tổng kết của tất cả giá trị tỷ lệ bên trong bảng tỷ giá.

Để có được tổng hợp các sản phẩm của người dùng.

DB::table("users")->get()->sum("products")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.