관계 열의 Laravel Eloquent Sum


111

쇼핑 카트 앱을 개발 중이 었는데 지금은 다음과 같은 문제가 생겼습니다 ..

사용자, 제품 및 카트 개체가 있습니다.
-장바구니 테이블에는 "id", "user_id", "product_id"및 타임 스탬프 열만 포함됩니다.
-UserModel "hasMany"카트 (사용자가 여러 제품을 저장할 수 있기 때문).
-CartModel은 "belongsTo"사용자 및 CartModel "hasMany"제품입니다.

이제 총 제품을 계산하려면 다음과 같이 호출 할 수 있습니다 Auth::user()->cart()->count()..

내 질문은 :이 사용자가 장바구니에있는 제품의 가격 (제품 열)의 SUM ()을 어떻게 얻을 수 있습니까?
나는 쿼리를 사용하지 않고 Eloquent로 이것을 달성하고 싶습니다 (주로 훨씬 더 깨끗하다고 ​​믿기 때문에).

답변:


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

문서는 일부 Collection메소드에 대해 약간 가볍지 만 모든 쿼리 작성기 집계는 http://laravel.com/docs/queries#aggregatesavg() 에서 찾을 수있는 것 외에 사용할 수있는 것처럼 보입니다 .


빠른 답장을 보내 주셔서 감사합니다. 이제 가격 열이 없다고 말합니다. eloquent가 제품 테이블을 전혀 보지 않는 것 같습니다 ....
theAdmiral

3
사실 그게 말이되는데, 관계에 제품 테이블을 추가해야합니다. 죄송합니다. $sum = Auth::user()->cart()->products()->sum('price');제품 테이블에있는 가격 열이 무엇이든 시도해보십시오 .
user1669496

1
그것은 나를 위해 일했습니다! 카트 클래스 사용을 중단했습니다. 이제 사용자와 제품 모두에 belongsToMany () 메소드가 있습니다. 이제 가격을 사용할 수 있습니다 : {{Auth :: user ()-> products-> sum ( 'price')}} Thanx,이 사건은 해결되었습니다.
theAdmiral

9
여기에 뭔가 잘못된 것이 있습니다. 링크는 집계 함수를 데이터베이스 쿼리에 적용하는 products->sum것을 의미 하지만, 이는 products ()가 반환하는 빌더 개체가 아닌 컬렉션 개체에 대한 호출 합계임을 의미합니다. 여기서 의미하는 바를 명확히하고 이상적으로는 둘 다 설명 할 수있는 링크를 제공하는 것이 좋습니다.
Benubird 2014

1
괄호없이 관계를 사용하는 @ user3253002 ...->products->...는 데이터베이스를 쿼리하여 현재 모델의 모든 관련 제품을 가져온 다음 해당 인 메모리 컬렉션으로 작업합니다. 를 사용 ...->products()->...하면 쿼리를 실행하지 않고 다음과 같은 ->sum()것이 호출 될 때까지 실행되지 않고 수정되며, 후자는 데이터베이스에서 불필요한 정보를 메모리로 전송하지 않기 때문에 더 효율적일 수 있습니다.
Siegen

62

이것은 당신의 대답이 아니지만 다른 문제에 대한 해결책을 찾는 사람들을위한 것입니다. 조건부로 관련 테이블 열의 합계를 얻고 싶었습니다. 내 데이터베이스에서 거래에는 많은 활동이 있습니다. Activities 테이블에서 "amount_total"의 합계를 얻고 싶었습니다. 여기에서 activities.deal_id = deal.id 및 activities.status = 지급되었으므로이 작업을 수행했습니다.

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

그것은 반환

"paid_sum_count" => "320.00"

거래 속성에서.

이것은 지금 내가 계산하지 않고 싶었던 합계입니다.


4
모든 레코드를 가져 오지 않고도 정렬 할 수 있으므로 대부분의 경우 가장 좋습니다.
Sabrina Leggett

15

비슷한 작업을 시도했는데 collect () 함수를 파악하기까지 많은 시간이 걸렸습니다. 따라서 다음과 같이 할 수 있습니다.

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

이것은 모든 항목의 합계를 제공합니다.


4
함수의 이름은 실제로collect()
레오나르도 BEAL

배열을 반복하는 것이 더 낫습니다. collect()당신은 처음부터 컬렉션을 해달라고 경우 컬렉션 개체로 배열을 풍부하게하는 데 사용되지만 것은 단지 원시 배열을 사용하는 것이 더 좋을 수도
화염

0

쿼리 작성기도 사용

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

테이블 요율 내의 모든 요율 값의 합계를 얻으려면.

사용자 제품의 요약을 얻으려면.

DB::table("users")->get()->sum("products")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.