Как вернуть общую стоимость для каждой компании, используя eloquent? - PullRequest
0 голосов
/ 27 сентября 2018

, поэтому у меня есть эта таблица в базе данных

+---------+------------+-------+
| Company |  periods   | value |
+---------+------------+-------+
| a1      | 01-01-2018 |  1000 |
| a1      | 01-02-2018 |   600 |
| a2      | 01-01-2018 |   500 |
| a2      | 01-03-2018 |   500 |
| a3      | 01-01-2018 |   500 |
| a3      | 01-02-2018 |   500 |
| a3      | 01-03-2018 |   500 |
+---------+------------+-------+

, и то, что я ожидаю получить по запросу, будет похоже на то, если я хочу получить общую стоимость всей компании за 01-02-2018, тогда она будетСуммируйте значение для каждой компании до 01-02-2018

+---------+------------+-------+
| Company |  periods   | value |
+---------+------------+-------+
| a1      | 01-02-2018 |  1600 |
| a2      | 01-02-2018 |   500 |
| a3      | 01-02-2018 |  1000 |
+---------+------------+-------+ 

, и если я хочу получить общую стоимость формы 01-03-2018, то оно также будет суммировать значение для каждой компании до 01-03-2018

+---------+------------+-------+
| Company |  periods   | value |
+---------+------------+-------+
| a1      | 01-03-2018 |  1600 |
| a2      | 01-03-2018 |  1000 |
| a3      | 01-03-2018 |  1500 |
+---------+------------+-------+ 

как это сделать на eloquent?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018
$from = date('2018-01-01');
$to = date('2018-02-01');

$data = Model::select(DB::raw('Company', 'periods', 'sum(value) as total_value'))
                ->groupBy('Company')
                ->whereBetween('periods', [$from, $to])
                ->get();

Можете ли вы попробовать приведенный выше код?$form дата должна быть самой первой датой, с которой вы начали запись.Вы должны изменить дату $to, чтобы получить общее время.

0 голосов
/ 27 сентября 2018

проблема в следующем:

, когда вы группируете строки по столбцу «значение», в строке результата, что будет значением «периоды»?Вы знаете, что перед группировкой было несколько различных значений 'period'.теперь среди них, какое значение 'period' MySQL должен поместить в строку результатов ...?

, поэтому его нельзя ' sql_mode = only_full_group_by '

либо вамнеобходимо удалить столбец «периоды» из запроса на выборку или можно объединить столбец «периоды».

Возможные решения.

$maxDate = // whatever date you wanna compare with.

$summery = Model::select(DB::row('Company, max(periods) AS periods, sum(value) AS value'))
    ->groupBy('Company')
    ->where('periods', '<=', $maxDate)
    ->get();
0 голосов
/ 27 сентября 2018

Используйте groupBy:

$point_history = Model::select(['Company', 'periods',DB::raw('sum(value) as value')])
                ->groupBy('Company')
                ->having('periods','01-02-2018')
                ->get();

условие записи периодов в качестве требования

...