与连接的求和函数是给总和乘以laravel ORM与mysql中的条目的次数

时间:2019-03-12 20:58:34

标签: php mysql sql laravel join

有2个表bills and payments,总销售额被插入到订单表中,收入被插入到付款表中。我想显示最近7天的总销售额和总现金收款,但查询给我的结果乘以laravel中同一日期的数据的次数。

法案enter image description here

付款enter image description here

我想获取最近bills.created_date=payments.created_date的最近7天中每一天的总金额。我的查询效果很好,但总和乘以特定日期的条目即可。

我的查询(Laravel):

public function salesAndRevenue(){
    $date = new Carbon\Carbon;

    $salesAndRevenue = 
        DB::table('bills')
        ->Join(
            'payments', 
            DB::raw('DATE(payments.created_at)'), 
            '=',
            DB::raw('DATE(bills.created_at)'))
        ->select(
            DB::raw('DATE(payments.created_at) as date'),
            DB::raw('sum(payments.amount) as total_revenue'),
            DB::raw('sum(bills.total_amount) as total_sales'))
        ->groupBy(DB::raw('DATE(payments.created_at)'))
        ->where(
            DB::raw('DATE(bills.created_at)'),
            '>',
            $date->subDays(7)->toDateTimeString())
        ->get()->toArray();    

        return $salesAndRevenue;
    }

我的预期结果:

array:2 [▼
  0 => {#254 ▼
    +"date": "2019-03-11"
    +"total_revenue": 5.0
    +"total_sales": 5.0
  }
  1 => {#255 ▼
    +"date": "2019-03-12"
    +"total_revenue": 1500.0
    +"total_sales": 1500.0
  }
]

我的输出:

array:2 [▼
  0 => {#254 ▼
    +"date": "2019-03-11"
    +"total_revenue": 5.0
    +"total_sales": 5.0
  }
  1 => {#255 ▼
    +"date": "2019-03-12"
    +"total_revenue": 4500.0
    +"total_sales": 4500.0
  }
]

但是此代码可以完美地工作,而无需使用join从单个表中获取数据。 喜欢:

$sales = 
    DB::table('bills')
    ->select(
        DB::raw('DATE(created_at) as date'), 
        DB::raw('sum(total_amount) as total_sales'))
    ->groupBy('date')
    ->where(
        DB::raw('DATE(created_at)'),
        '>',
        $date->subDays(7)->toDateTimeString())
    ->get()->toArray();

输出:

array:2 [▼
  0 => {#259 ▼
    +"date": "2019-03-11"
    +"total_sales": 5.0
  }
  1 => {#260 ▼
    +"date": "2019-03-12"
    +"total_sales": 1500.0
  }
]

1 个答案:

答案 0 :(得分:4)

问题来自您的JOIN条件:

DB::table('bills')
->Join(
    'payments', 
    DB::raw('DATE(payments.created_at)'), 
    '=', 
    DB::raw('DATE(bills.created_at)')
)

您要删除日期的时间部分,然后再进行合并:因此,您最终会为每个payments得到几个匹配的bill

从您的示例数据中,我看起来像payments.bill_id列是为了加入:

DB::table('bills')
->Join(
    'payments', 
    DB::raw('payments.bill_id'), 
    '=', 
    DB::raw('bills.id')
)