Laravel - GroupBy as Alias - PullRequest
       28

Laravel - GroupBy as Alias

0 голосов
/ 29 августа 2018

У меня есть следующее в одной из моих функций, но я бы хотел назвать его псевдонимом 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()]
            ]);

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

enter image description here


///

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

"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 on loads. tractorID = tractor. id левое соединение employees on loads. driverID = employees. id левое соединение customers как shipperCustomer on shipments. ship_from = shipperCustomer. id левое соединение customers как consigneeCustomer на shipments. ship_to = consigneeCustomer. id где loads. type = 1 и loads. status = 2 и shipmentID в (выберите shipmentID из loads группы по shipmentID, имеющей count (*) = 1) группу по DATE_FORMAT (loads.dateTime, "% M% e ,% Y "))"

// Обновление с другим возвратом enter image description here

// Пара обновлений - 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_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 = 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') -> получить ();

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

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

0 голосов
/ 29 августа 2018

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

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#function_any-value

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

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

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

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

ВЫБРАТЬ имя, ЛЮБОЕ ЗНАЧЕНИЕ (адрес), МАКС. (Возраст) ОТ ИМЕНИ ГРУППЫ ПО;

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

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

...