2017-07-16 41 views
0

我有兩個模型,PlanTransactions。每個Plan可以有許多Transactions。我想獲得與所有計劃相關的所有交易的總金額。現在我這樣做是這樣的:Laravel使用過濾器和地圖而不是foreach

$plans = $this->plan->with('transactions')->get(); 

    $total = []; 

    foreach($plans as $plan) 
    { 
     foreach($plan->transactions as $transaction) 
     { 
      $total[] = $transaction->amount; 
     } 
    } 

    dd(array_sum($total)); // Works, I get the total amount of all transactions that are related to a Plan. 

但我想擺脫foreach循環,並使用filter和/或map代替。我已經嘗試以下內容:

$test = $plans->filter(function ($plan) { 
     return $plan->has('transactions'); 
    })->map(function ($plan) { 
     return $plan->transactions; 
    })->map(function ($transaction) { 
     return $transaction; // Not sure what to do here, $transaction->amount doesn't work 
    }); 

我正在被卡住在最後一位,最後我收集了一個集合。任何想法如何實現這一點,至少不使用foreach循環?也許可能在查詢本身?

所以我有幾個Plans,並且每個Plan可以有很多Transactions。每個Transaction有一個amount字段,其​​中我存儲每個Transaction的金額。我希望獲得與計劃相關的所有交易的總金額。所以,這些交易總額。

回答

1

假設你已經有了一個計劃,在該計劃中的交易屬性將是一個集合,所以你可以使用該sum()方法:

$total = $plan->transactions->sum('amount'); 

因爲它只是一個具體的計劃,它不不管你是否渴望加載它。但是,如果它沒有被已經加載,你可以做到這一點通過數據庫來代替:

$total = $plan->transactions()->sum('amount'); 

如果你有計劃的集合,使用reduce()

$total = $plans->reduce(function ($carry, $plan) { 
    return $carry + $plan->transactions->sum('amount'); 
}, 0); 

在這情況下,您確實希望加載事務以減少查詢次數。 (否則,請參考上面通過數據庫去代替。)


如果你從查詢的到來,您可以使用加入或雙查詢 - 後者一般是簡單的:

$ids = Plan::where('condition')->pluck('id')->all(); 
$total = Transaction::whereIn('plan_id', $ids)->sum('amount'); 

而且,當然,如果您只是想要總金額,無論如何,根本沒有必要完成計劃。 :)

$total = Transaction::sum('amount'); 
+0

在我看來,「減少」位的確有竅門。 @Alexey Mezenin,我的計劃和交易使用多對多多態關係相關,所以我的交易沒有'plan_id',忘記提及。謝謝@Joel Hinz和謝謝@Alexey Mezenin的幫助:) – Hardist

+1

我想指出,來自@Joel Hinz的偉大答案,謝謝你的解釋和例子,真的很感謝它 – Hardist

+0

沒有汗水,很高興它是有幫助的。 :) –

1

既然你有計劃ID,您可以使用sum()方法:

$this->transaction->where('plan_id', $planId)->sum('amount'); 

要計算量的所有交易,除去where()一部分。

要計算多個計劃的金額,請使用whereIn() intsead where()

+0

感謝您的答案,但與此我得到的總交易量,而不是每筆交易'金額'的總量。也許我解釋了它在我的OP錯誤或我誤解你的答案:) - 我會更新我的OP – Hardist

+1

我認爲你誤會 - 他不想要的交易數量,他想在交易表中總結一個字段在計劃上。 –

+0

這完全不是我想要做的:P我想獲得每筆交易的「金額」字段的總和。我不想簡單地計算有多少行可以這麼說:)編輯,謝謝@Joel Hinz解釋它,更有意義,因爲沒有正確解釋它我自己 – Hardist

相關問題