带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql
Posted
技术标签:
【中文标题】带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql【英文标题】:Sum function with join is giving sum multiplies number of times of entries in laravel ORM with mysql 【发布时间】:2019-08-03 11:03:33 【问题描述】:有2个表bills and payments
,总销售额插入到订单表中,收入插入到付款表中。我想显示过去 7 天的总销售额和总现金收款,但我的查询给我的结果乘以 laravel 中同一日期的数据的次数。
表格账单:
表格付款:
我想获取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
]
但是这段代码在不使用连接从单个表中获取数据的情况下完美运行。 喜欢:
$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】:问题出在你JOIN
条件:
DB::table('bills')
->Join(
'payments',
DB::raw('DATE(payments.created_at)'),
'=',
DB::raw('DATE(bills.created_at)')
)
您正在删除日期的时间部分,然后加入:因此您最终会为每个 bill
获得多个匹配的 payments
。
从您的示例数据来看,在我看来,payments.bill_id
列是为了加入:
DB::table('bills')
->Join(
'payments',
DB::raw('payments.bill_id'),
'=',
DB::raw('bills.id')
)
【讨论】:
以上是关于带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql的主要内容,如果未能解决你的问题,请参考以下文章