Как в Laravel связать 3 таблицы и объединить строки, используя условие по дате?

Изображение к вопросу
  • 15 августа 2023 г. 12:16
Ответы на вопрос 3
Для того чтобы связать 3 таблицы и объединить строки по условию даты в Laravel, вы можете использовать методы `join`, `groupBy` и `select`:

```php
$results = DB::table('table1')
    ->join('table2', 'table1.id', '=', 'table2.table1_id')
    ->join('table3', 'table1.id', '=', 'table3.table1_id')
    ->select('table1.date', 
        DB::raw('SUM(table2.income) as total_income'), 
        DB::raw('SUM(table3.expenses) as total_expenses'))
    ->where('table1.date', '=', '2022-01-01')
    ->groupBy('table1.date')
    ->get();
```

В этом примере `table1`, `table2` и `table3` представляют ваши таблицы, а `'2022-01-01'` - дата, по которой вы хотите объединить строки. Метод `join` используется для связи таблиц по общим столбцам (`table1.id = table2.table1_id` и `table1.id = table3.table1_id`). Метод `groupBy` позволяет группировать результаты по столбцу даты (`table1.date`). Используя `DB::raw`, вы можете вычислять сумму значений доходов (`SUM(table2.income)`) и расходов (`SUM(table3.expenses)`).

Обратите внимание, что вам также необходимо включить модели для своих таблиц, чтобы использовать отношения и получить доступ к данным через связанные таблицы.
join не является неуместным в данном случае. Он используется для объединения таблиц и получения нужных данных из связанных таблиц. В вашем случае, join используется для связывания таблицы postbacks с таблицами campaigns, providers и users, чтобы получить нужные данные для выборки. Это сделано для того, чтобы вы могли использовать условия и фильтры на основе данных из этих связанных таблиц.

Относительно задачи, вы можете определить, правильно ли вы поняли её, основываясь на вашем объяснении и написанном коде.
Спасибо за совет, Дмитрий! Я изменил код следующим образом: вместо использования трех таблиц, я создал одну таблицу и выполнил выборку с помощью метода groupBy. Вот обновленный код:

```
$postbacks = DB::table('postbacks as p')
    ->select(
        DB::raw('DATE(p.created_at) as date'),
        'u.name as user_name',
        'c.name as campaign_name',
        'c.domain',
        'pr.name as provider_name',
        'pr.commission',
        DB::raw('SUM(p.income) AS t_income'),
        DB::raw('SUM(p.cost) AS t_cost')
    )
    ->join('campaigns as c', 'p.campaign_id', '=', 'c.id')
    ->join('providers as pr', 'c.provider_id', '=', 'pr.id')
    ->join('users as u', 'c.user_id', '=', 'u.id')
    ->whereBetween('p.created_at', ['2023-08-15', '2023-08-17'])
    ->where('c.user_id', 1)
    ->groupBy(DB::raw('DATE(p.created_at)'), 'c.id')
    ->orderBy('date', 'ASC')
    ->get();
```

Также, у меня возник вопрос: является ли использование метода join неверным в данном случае? Я посмотрел документацию Laravel и мне кажется, что он используется правильно. Вот ссылка на документацию, где описаны примеры использования метода join: https://laravel.com/docs/10.x/queries#joins

Буду благодарен за ваше мнение!
Похожие вопросы