Laravel Красноречивая сумма по реалиям - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь суммировать столбец original_total таблицы order_items из таблицы orders. Отношение: Order имеет много order_items

....
$total[ $from->format('Y-m') ] = Order::whereBetween(
    'created_at', [$cloneFrom->startOfMonth()->toDateTimeString(), $cloneFrom->endOfMonth()->toDateTimeString()]
)->withCount(['orderItems as original_total' => function ($query) {
    $query->select(DB::raw('sum(original_total)'));
}])->sum('original_total');
....

Я получил эту ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'original_total' in 'field list' (SQL: select sum(`original_total`) as aggregate from `orders` where `created_at` between 2019-01-01 00:00:00 and 2019-01-31 23:59:59)

Затем я использую get до sum, это работало, но генерировалось слишком много запросов и замедление моего приложения. Есть ли способ подсчитать сумму без использования get метода?

1 Ответ

1 голос
/ 21 апреля 2020

Вы пытаетесь использовать результаты подвыбора в другом выборе, что является ограничением в SQL. Этот подход может сработать, но я думаю, что есть что-то более простое. Я бы просто присоединился к соотношению в.

Order::whereBetween(
    'created_at', [
        $cloneFrom->startOfMonth()->toDateTimeString(),
        $cloneFrom->endOfMonth()->toDateTimeString(),
    ])
    ->leftJoin('order_items', 'orders.id', 'order_items.order_id')
    ->sum('order_items.original_total');

Без суммы запрос выглядел бы примерно так, без некоторых столбцов для упрощения форматирования.

order.id | order_items.id | order_items.original_total

       1                1                           10
       1                2                           10
       1                3                           10
       2                4                            5
       2                5                            5

Если вы делаете обычные Запросы, у вас будут двойные заказы в вашем возврате, но так как вы заботитесь только о сборе всех итогов, вы можете использовать этот подход, производительность должна быть действительно хорошей, так как она объединяет внешние ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...