Laravel - GroupBy as Alias

问题描述 投票:0回答:2

我在我的一个函数中有以下内容,但是想将它称为名为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 SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列'truckin.loads.id',它在功能上不依赖于GROUP BY子句中的列;这是选择loads.idshipments.pro_numbershipments.idemployees.last_namedrivertractor.unit_idtractorloads.dateTimeloadsDTshipperCustomer.customer_nameShipperCustomerNameconsigneeCustomer.customer_nameConsigneeCustomerName:与的sql_mode = only_full_group_by(SQL不兼容的,shipments.cn_shipfromNameShipperNameshipments.cn_shiptoNameConsigneeNameloads留在shipments.loads加入shipmentID = shipments.id左加入equipment作为tractorloads.tractorID = tractor.id留在employees.loads = driverID.employees加入id左加入customers作为shipperCustomershipments.ship_from = shipperCustomer.id左加入customers作为consigneeCustomershipments.ship_to = consigneeCustomer.id其中loads.qazxsw poi = 1和type.loads = 2和status in(由shipmentID选择shipmentIDloads计数(*)= 1)组由DATE_FORMAT(loads.dateTime,“%M%e,%Y”))“

//用另一个回归更新shipmentID

//几个更新 - 2018年8月30日

根据您的原始建议,我进行了更新,但收到此错误:

“SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT列表的表达式#2不在GROUP BY子句中,并且包含非聚合列'truckin.shipments.pro_number',它在功能上不依赖于GROUP BY子句中的列;这是与sql_mode = only_full_group_by不兼容(SQL:选择ANY_VALUE(loads.id),shipment.pro_number,shipment.id,employees.last_name作为驱动程序,tractor.unit_id作为tractor,loads.dateTime,shipperCustomer.customer_name作为ShipperCustomerName,consigneeCustomer.customer_name as ConsigneeCustomerName,shipments.cn_shipfromName如ShipperName,shipments.cn_shiptoName如ConsigneeName从enter image description here留在loads.shipments加入loads = shipmentID.shipments左加入id作为equipmenttractor.loads = tractorID.tractor留在id.employees = loads.driverID加入employees左加入id作为customersshipperCustomer.shipments = ship_from.shipperCustomer左加入id作为customersconsigneeCustomer.shipments = qazxsw poi.ship_to其中consigneeCustomer.id = 2,loads.type = 1组DATE_FORMAT(loads.dateTime,“%M%e,%Y”))“

所以我继续前进,最后由于级联故障而不得不做以下事情:

$ loads = $ query-> groupBy(DB :: raw('DATE_FORMAT(loads.dateTime,“%M%e,%Y”)'),'loads.dateTime','shipment.id','shipment.pro_number ”, '驱动器', '拖拉机', 'ShipperCustomerName', 'ConsigneeCustomerName', 'ShipperName', 'ConsigneeName') - >得到();

现在显然这是不对的,但这是我可以得到任何类型的返回的唯一方法,最终得到以下结果:

loads

laravel laravel-5 eloquent laravel-orm
2个回答
0
投票

最后一种方法,改变这个:

status

对此:

enter image description here

并将groupBy保留为

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');

检查链接上的示例并注意我在这里引用的内容:

发生故障是因为address是一个非聚合列,既不在GROUP BY列中命名,也不在功能上依赖于它们。因此,每个名称组中的行的地址值是不确定的。有多种方法可以使MySQL接受查询:

更改表以使name成为主键或唯一的NOT NULL列。这使MySQL能够确定该地址在功能上依赖于名称;也就是说,地址由名称唯一确定。 (如果必须允许NULL作为有效名称值,则此技术不适用。)

使用ANY_VALUE()来引用地址:

SELECT名称,ANY_VALUE(地址),MAX(年龄)FROM t GROUP BY名称;

在这种情况下,MySQL忽略每个名称组中地址值的不确定性并接受查询。如果您根本不关心为每个组选择哪个非聚合列的值,这可能很有用。与SUM()或COUNT()等函数不同,ANY_VALUE()不是聚合函数。它只是用来抑制非确定性的测试。

禁用ONLY_FULL_GROUP_BY。这相当于在启用ONLY_FULL_GROUP_BY时使用ANY_VALUE(),如上一项所述。


0
投票

在config / database.php的数据库配置中,更改strict => false默认为true

© www.soinside.com 2019 - 2024. All rights reserved.