2017-11-20 10 views
0

次の問題があります - 私はテーブルinvoicesとテーブルreceiptsを持っています。請求書はエージェントによって作成され、エージェントごとに販売されたいが、番号は間違っている。ここで合計請求書 - 合計でない領収書

は、私が試したものです:

$agents = Agent::get(); 
$invoices_receipts_agent = array(); 
foreach ($agents as $agent) { 
    $payment_invoice = 0; 
    $payment_recepit = 0; 
    $id_agent = $agent->id_agent; 

    $invoices = Invoice::whereAgent_id($id_agent)->get(); 
    foreach ($invoices as $invoice) { 

     $payment_invoice = $payment_invoice + $invoice->total_pay; 
     $recepits = Recepit::whereInvoice_id($invoice->id_invoice)->get(); 
     if (count($recepits) > 0) { 
      foreach ($recepits as $recepit) { 
       $payment_recepit = $payment_recepit + $recepit->amount_payd; 
      } 
     } 
    } 

    $total = $payment_invoice - $payment_recepit; 
    $total_agents = ['name' => $agent->name, 'total' => $total]; 
    array_push($invoices_receipts_agent, $total_agents); 
} 

私がテストを行い、ID 5

First invoice: 10 
Second invoice : 20 
Total invoices: 30 

とエージェントのための2つの請求書を作成した後、私は第二請求書のrecepitを行なったし、予想合計が見つかりました:

Total: 10 + 20 - 20 = 10 (correct total) 

そして、それは素晴らしいことだが、私は3600枚の請求書やソムとエージェントを持っています何かが合計で間違っています。合計(合計=請求書 - レセピット)は大きすぎますが、理由を把握することはできません。

詳細:数字のフィールドはfloatです。

+0

1つの請求書に複数の領収書を入れることはできますか? –

+0

@AaronDietz yesは複数の領収書になる可能性があります – Theack44

+0

このロジックの大半はPHPではなくデータベースで処理できるため、特にどの出力を必要としますか。 – fubar

答えて

0

まず、Eloquent Relationshipsを使用してこの問題を処理する簡単な方法があります。この場合 は、として、エージェントと請求書は1対多の関係を定義することができます。

class Agent { 
    ... 
    function invoices(){ 
    return $this->hasMany('App-Namespace\Invoice') 
    } 
} 

...と請求書上の逆の関係を定義します。 次に、請求書には1つ以上の領収書を含めることができるため、請求書モデルと領収書モデルの間で同じ処理を行う必要があります。エージェントテーブルの主キーはidがあるのであれば 、あなたが言うことができる:

$agent = Agent::find($agent_id)->invoices->get(); 

が...エージェントの請求書を取得します。または:

$invoice = Invoice::find($invoice_id)->receipts->get(); 

...特定の請求書の領収書をすべて取得する。

そして最後に、あなたのコードを実装:

$agents = Agent::all(); 
    $invoices_receipts_agent = array(); 

    foreach ($agents as $agent) { 

    $payment_invoice = 0; 
    $invoices = $agent->invoices->get(); 

    foreach ($invoices as $invoice){ 

     $payment_invoice += $invoice->total_pay; 
     $payment_receipt += $invoice->receipts->sum('amount_paid'); 

    } 

    $total = $payment_invoice + $payment_receipt; 
    $invoices_receipts_agent[] = ['name' => $agent->name, 'total' => $total]; 
    } 

注:私は列の値の合計を取得するために合計コレクション機能を使用しているが、特定の領収書のをによってAmount_Paid。あなたはそれをあなたのコードのこの現在のバージョンを確認することができ

$total_paid = $agent->invoices()->sum('total_pay'); 
+0

なぜこの方法で問題が解決すると思いますか?私はしようとします。しかし、私はあなたの意見が、なぜこれが問題を解決すると思うかを知ってほしいです!多くのお礼ありがとうございます。 – Theack44

+0

私のコメントでは、コードを整理し、その後に間違いを探すのを手伝っています。 –

+0

私は試しましたが、数字は同じです – Theack44

0

:あなたは次のように請求書のTOTAL_PAY列の合計を取得するために同じ何ができますか?

私はのようないくつかの誤字を参照してください。

ここでは、我々は問題を抱えている
$recepits = Recepit::whereInvoice_id($invoice->id_invoice)->get(); 
    if (count($receipts) > 0) { 

を:

  1. 変数は$ recepitsという名前が、その後、他の名前($領収書)と、次の行で呼ばれています。
  2. $ receiptsは配列ではなく、コレクション(Eloquentクエリの結果)でなければなりません。カウントを得るためには、$ receipts-> count()を入力する必要があります。

これが最終的なコードであれば、結果は間違いなく結果に影響します。

+0

応答をありがとう。私は編集しました。コードはうまく書けました。そして私は$ receipts-> count()でcount($ receipts)を変更しようとしましたが、数値は同じです:( – Theack44

+0

もっと正確な応答を与えるためにあなたのコードを実際のバージョンで編集できますか?ありがとう –

+0

実際のコードです – Theack44

関連する問題