我有一个无法解决的问题。 Fyi,我正在使用Laravel 5.6
我有一个offers
表和一个requests
表;
offers-table
- id
- quotation_amount
- ...
requests-table
- id
- offer_id
- date
- ...
这是一对多关系。需要说明的是:可以多次请求一个要约,而一个请求仅属于一个要约。 (关系设置正确。)
现在,我需要知道每月quotation_amount
的总金额。 第一个请求(在日期列中选择)在确定要分组的月份方面领先。其他请求基本上应被忽略。
我们需要这个的原因是,我们可以看到相比我们提供给客户的产品,我们的销售量是多少。如果我们在一个月内为某商品提供1.000.000的报价,但在同一个月内只卖出100.000(10%),则销售部门出了问题,或者我们的报价太贵了:)。
因此,为了获得与之比较的数据,我有一个projects
表,该表具有一个contract_sum
和sale_date
列。这要容易得多,因为我可以做到这一点;
$sales['projects'] = array_replace(
array_fill_keys(range(1, 12), 0), $projects->groupBy('sale_date.month')->map(function($projects) {
return $projects->pluck('contract_sum')->sum();
})->toArray()
);
上面代码的输出;
Array
(
[1] => 760335
[2] => 1154054
[3] => 683762
//... untill 12
)
但是要获得要约报价量的相同输出,我需要日期来自某个关系,该关系可能会有多个结果,我不知道该怎么做。我还尝试了类似以下内容和不同的变体;
$offers = Offer::with(['requests' => function($query) {
$query->orderBy('date')->take(1);
}])->whereHas('requests', function($query) {
$query->whereMonth('date', $month);
})->get();
但是上面的方法不起作用,因为如果两个不同的月中只有一个要约有两个请求,则这两个月都将被计入。
谁能帮助我或指出正确的方向?
答案 0 :(得分:1)
尝试使用原始查询:
SELECT MONTH(r.first_date) AS offer_month, SUM(o.quotation_amount) as total
FROM offers o INNER JOIN
(
SELECT offer_id, MIN(date) first_date FROM requests r
GROUP BY offer_id
) r
ON o.id=r.offer_id
WHERE YEAR(r.first_date)=...
GROUP BY offer_month