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, как описано в предыдущем пункте.