Функция суммы с объединением дает сумму, умноженную на количество раз записей в ORM laravel с mysql - PullRequest
4 голосов
/ 12 марта 2019

Есть 2 таблицы bills and payments, и общий объем продаж вставляется в таблицу заказов, а выручка - в таблицу платежей.Я хотел показать общий объем продаж и общий сбор наличных за последние 7 дней, но мой запрос, дающий мне результат, умножается на количество раз, когда данные за одну и ту же дату в laravel.

таблица счета : enter image description here

таблица платежи : enter image description here

Я хочу получить общее количество каждого дня за последние семь дней, где bills.created_date=payments.created_date.мой запрос работает хорошо, но он дает мне общую сумму, умноженную на записи за определенный день.

Мой запрос (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 Ответ

4 голосов
/ 13 марта 2019

Проблема исходит от вас JOIN Состояние:

DB::table('bills')
->Join(
    'payments', 
    DB::raw('DATE(payments.created_at)'), 
    '=', 
    DB::raw('DATE(bills.created_at)')
)

Вы удаляете временную часть дат, затем присоединяетесь: следовательно, вы получаете несколько подходящих payments для каждого bill.

Из ваших примеров данных мне кажется, что столбец payments.bill_id существует для присоединения:

DB::table('bills')
->Join(
    'payments', 
    DB::raw('payments.bill_id'), 
    '=', 
    DB::raw('bills.id')
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...