Laravel - GroupBy as Alias

У меня есть следующее в одной из моих функций, но я бы хотел назвать его псевдонимом Date:

$loads = $query->get()->groupBy(function($item){
    return Carbon::parse($item->dateTime)->format('F j, Y');
});

это $query начинается как: $query = DB::table('loads')...

и поле dateTime это метка времени.

Есть ли правильный способ сделать это, чтобы включить псевдоним? Спасибо!

// Обновление всей функции контроллера:

public function apiList(Request $request){
    $query = DB::table('loads')
              ->leftJoin('shipments', 'loads.shipmentID', '=', 'shipments.id')
              ->leftJoin('equipment as tractor', 'loads.tractorID', '=', 'tractor.id')
              ->leftJoin('employees', 'loads.driverID', '=', 'employees.id')
              ->leftJoin('customers as shipperCustomer', 'shipments.ship_from', '=', 'shipperCustomer.id')
              ->leftJoin('customers as consigneeCustomer', 'shipments.ship_to', '=', 'consigneeCustomer.id')
              ->select('loads.id','shipments.pro_number','shipments.id','employees.last_name as driver','tractor.unit_id as tractor','loads.dateTime','shipperCustomer.customer_name as ShipperCustomerName','consigneeCustomer.customer_name as ConsigneeCustomerName','shipments.cn_shipfromName as ShipperName','shipments.cn_shiptoName as ConsigneeName');

    if($request->type){
        $query->where('loads.type', $request->type);
    }

    if($request->status){
        $query->where('loads.status', $request->status);
    }

    if($request->type == 1 && $request->status == 2){
        $query->whereIn('shipmentID', function ( $query ) {
            $query->select('shipmentID')->from('loads')->groupBy('shipmentID')->havingRaw('count(*) = 1');
        });
    }

    $loads = $query->get()->groupBy(function($item)
                {
                  return Carbon::parse($item->dateTime)->format('F j, Y');
                });

    return response()->json([
                ['loads'=>$loads],
                ['time'=>Carbon::now()]
            ]);

// ОБНОВЛЕНИЕ ПОКАЗАТЬ ТЕКУЩИЕ ВОЗВРАЩЕННЫЕ ДАННЫЕ:

введите описание изображения здесь


///

К сожалению, я получаю следующее:

"SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец" truckin.loads.id ", который функционально не зависит от столбцов в предложении GROUP BY; это несовместим с sql_mode=only_full_group_by (SQL: выберите loads,id, shipments,pro_number, shipments,id, employees,last_name как driver, tractor,unit_id как tractor, loads,dateTime как loadsDT, shipperCustomer,customer_name как ShipperCustomerName, consigneeCustomer,customer_name как ConsigneeCustomerName, shipments,cn_shipfromName как ShipperName, shipments,cn_shiptoName как ConsigneeName от loads оставил присоединиться shipments на loads,shipmentID знак равно shipments,id оставил присоединиться equipment как tractor на loads,tractorID знак равно tractor,id оставил присоединиться employees на loads,driverID знак равно employees,id оставил присоединиться customers как shipperCustomer на shipments,ship_from знак равно shipperCustomer,id оставил присоединиться customers как consigneeCustomer на shipments,ship_to знак равно consigneeCustomer,id где loads,type = 1 и loads,status = 2 и shipmentID в (выберите shipmentID от loads группа по shipmentID с числом (*) = 1) группы по DATE_FORMAT(loads.dateTime, "%M %e, %Y"))"

// Обновление с другим возвратом введите описание изображения здесь

// Пара обновлений - 30 августа 2018 г.

Исходя из вашего первоначального предложения, я сделал обновления, но получил эту ошибку:

"SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение № 2 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец" truckin.shipments.pro_number ", который функционально не зависит от столбцов в предложении GROUP BY; это несовместим с sql_mode=only_full_group_by (SQL: выберите ANY_VALUE(loads.id), shipments.pro_number, shipments.id, employee.last_name в качестве драйвера, Tractor.unit_id в качестве трактора, loads.dateTime, shipperCustomer.customer_name в качестве имени клиента Customer ConsigneeCustomerName,shipments.cn_shipfromName от имени грузоотправителя, shipments.cn_shiptoName от имени получателя от loads оставил присоединиться shipments на loads,shipmentID знак равно shipments,id оставил присоединиться equipment как tractor на loads,tractorID знак равно tractor,id оставил присоединиться employees на loads,driverID знак равно employees,id оставил присоединиться customers как shipperCustomer на shipments,ship_from знак равно shipperCustomer,id оставил присоединиться customers как consigneeCustomer на shipments,ship_to знак равно consigneeCustomer,id где loads,type = 2 и loads,status = 1 группа по DATE_FORMAT(loads.dateTime, "%M %e, %Y"))"

Таким образом, я пошел дальше и в итоге вынужден был сделать следующее из-за каскадного сбоя:

$ load = $query->groupBy(DB::raw('DATE_FORMAT(loads.dateTime, "%M %e, %Y")'), 'loads.dateTime','shipments.id', 'shipments.pro_number ", 'водитель', 'трактор','ShipperCustomerName','ConsigneeCustomerName','ShipperName','ConsigneeName')-> получить ();

Теперь, очевидно, это не правильно, но это был единственный способ получить возврат любого вида, который в итоге оказался следующим:

введите описание изображения здесь

2 ответа

В конфигурации базы данных в config/database.php изменить строго =>false По умолчанию это правда

Последний подход, измените это:

select('loads.id','shipments.pro_number','shipments.id','employees.last_name as driver','tractor.unit_id as tractor','loads.dateTime','shipperCustomer.customer_name as ShipperCustomerName','consigneeCustomer.customer_name as ConsigneeCustomerName','shipments.cn_shipfromName as ShipperName','shipments.cn_shiptoName as ConsigneeName');

К этому:

selectRaw('ANY_VALUE(loads.id), shipments.pro_number, shipments.id, employees.last_name as driver, tractor.unit_id as tractor, loads.dateTime, shipperCustomer.customer_name as ShipperCustomerName,consigneeCustomer.customer_name as ConsigneeCustomerName,shipments.cn_shipfromName as ShipperName,shipments.cn_shiptoName as ConsigneeName');

И покинуть группу как

$query->groupBy(DB::raw('DATE_FORMAT(loads.dateTime, "%M %e, %Y")'))->get();

Если вы хотите узнать больше об этом решении, проверьте: https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html

Посмотрите пример по ссылке и позаботьтесь о том, что я цитирую здесь:

Ошибка возникает из-за того, что адрес является неагрегированным столбцом, который не назван ни среди столбцов GROUP BY, ни функционально зависит от них. В результате значение адреса для строк в каждой группе имен является недетерминированным. Есть несколько способов заставить MySQL принять запрос:

Измените таблицу, чтобы сделать имя первичным ключом или уникальным столбцом NOT NULL. Это позволяет MySQL определить, что адрес функционально зависит от имени; то есть адрес однозначно определяется по имени. (Этот метод неприменим, если в качестве допустимого значения имени должно быть разрешено NULL.)

Используйте ANY_VALUE() для ссылки на адрес:

ВЫБЕРИТЕ имя, ANY_VALUE(адрес), MAX(возраст) ОТ t GROUP BY name;

В этом случае MySQL игнорирует недетерминированность значений адресов в каждой группе имен и принимает запрос. Это может быть полезно, если вам просто все равно, какое значение неагрегированного столбца выбрано для каждой группы. ANY_VALUE() не является агрегатной функцией, в отличие от таких функций, как SUM() или COUNT(). Это просто действует, чтобы подавить тест на недетерминизм.

Отключить ONLY_FULL_GROUP_BY. Это эквивалентно использованию ANY_VALUE() с включенным ONLY_FULL_GROUP_BY, как описано в предыдущем пункте.

Другие вопросы по тегам