Группировка по месяцам или неделям с красноречивым Laravel - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть проект, который управляет моими инвестициями, то есть он берет мое ежедневное утверждение и сохраняет его в моем проекте, чтобы я мог видеть, сколько это приносит, в итоге у меня есть таблица, в которой эти значения ежедневноЯ уже могу генерировать информацию, разделенную по дням, и она работает отлично (на самом деле это немного сложнее, чем то, что я делаю, но основа такова);

Но теперь становится плохо видеть, когда яполучить очень большой диапазон дат, например, 1 год, в нем перечислены каждый день, я хотел, чтобы группировать по месяцам или неделям,

Заранее благодарен за любую помощь.

    $rows =  AtivosExtrato::select('titulo_id', DB::raw('SUM(valor_bruto_atual) AS valor'), 'data_imports.data_import as created_at')
    ->join('titulos','titulo_id', '=', 'titulos.id' )
    ->join('representantes','representante_id', '=', 'representantes.id' )
    ->join('data_imports','data_import_id', '=', 'data_imports.id' )
    ->where('user_id', Auth::user()->id) 
    ->whereBetween('data_imports.data_import', [$request->input('start_date'), $request->input('end_date')])
    ->groupBy('titulos.nome_titulo')
    ->groupBy('data_imports.data_import')
    ->orderBy('data_import')
    ->orderBy('titulos.nome_titulo')
    ->get();  

Короткообъяснение каждой красноречивой информации:

AtivosExtrato: модель, в которой указана информация о ежедневном доходе;

1) соединение: иностранная таблица для имениз названий

2) объединение: чужая таблица для имени брокера

3) объединение: таблица, в которой сохраняется дата импорта иотносится к идентификатору в активе тВ состоянии Extrato, он имеет функцию, позволяющую уменьшить вес во время поисков и повысить производительность.

, где: ограничение для рассматриваемого пользователя

WhereBetween: ограничение по диапазону дат

1) groupBy: Группировка по заголовкам

2) groupBy: группировка по дате импорта

Структура таблицы:

ativos_extrato ativos_extratos ativos_extratos внешний ключ ativos_extratos Index

data_imports data_imports

Решение:

$rows =  AtivosExtrato::select(
            'titulo_id',
            DB::raw('SUM(valor_bruto_atual) AS valor'),
            'data_imports.data_import as created_at',
            DB::raw('WEEK(data_imports.data_import) AS weeknumber')
        )
        ->join('titulos','titulo_id', '=', 'titulos.id' )
        ->join('representantes','representante_id', '=', 'representantes.id' )
        ->join('data_imports','data_import_id', '=', 'data_imports.id' )
        ->where('user_id', Auth::user()->id)
        ->whereIn('ativos_extratos.data_import_id',
        DataImport::Select(DB::raw('max(ID)'))
            ->whereBetween('data_import',  [$request->input('start_date'), $request->input('end_date')])
            ->groupBy(db::raw('Week(data_import)'))            )
            ->whereBetween('data_imports.data_import', [$request->input('start_date'), $request->input('end_date')])
        ->groupBy('titulos.nome_titulo')
        ->groupBy('weeknumber')            
        ->orderBy('data_import')            
        ->orderBy('titulos.nome_titulo')
        ->get();

1 Ответ

0 голосов
/ 09 декабря 2018

Добавьте DB::raw(WEEK(data_imports.data_import) AS weeknumber), а затем замените ->groupBy('data_imports.data_import') на ->groupBy('weeknumber') и то же самое на MONTH(), если вы хотите сгруппировать по месяцам: добавьте еще один столбец выбора DB::raw(MONTH(data_imports.data_import) AS monthnumber) и замените ->groupBy('data_imports.data_import') на ->groupBy('monthnumber').Таким образом, весь запрос Eloquent с группировкой по неделям будет:

$rows =  AtivosExtrato::select('titulo_id', DB::raw('SUM(valor_bruto_atual) AS valor'), 'data_imports.data_import as created_at', DB::raw('WEEK(data_imports.data_import) AS weeknumber'))
->join('titulos','titulo_id', '=', 'titulos.id' )
->join('representantes','representante_id', '=', 'representantes.id' )
->join('data_imports','data_import_id', '=', 'data_imports.id' )
->where('user_id', Auth::user()->id) 
->whereBetween('data_imports.data_import', [$request->input('start_date'), $request->input('end_date')])
->groupBy('titulos.nome_titulo')
->groupBy('weeknumber')
->orderBy('data_import')
->orderBy('titulos.nome_titulo')
->get(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...