I am working on a API and I am using resource to return the collection. I am having problem in grouping data. I have following code.
return TicketResource::collection(
Ticket::query()
->search(request('search'))
->whereHas(
'latestStatus', function($query) use ($request){
$query->whereIn('status_id', $request->status)
->where(function($inner_query) use ($request){
if($request->status === 1){
$inner_query->where( 'tickets.user_id', '!=', auth()->user()->id);
} elseif($request->status === 2){
$inner_query->where( 'ticket_statuses.user_id', auth()->user()->id);
}
});
}
)
->join('ticket_statuses', function($join){
$join->on('tickets.id', '=', 'ticket_statuses.ticket_id');
})
->where(function ($query) use ($userBrands, $userAppliances, $buyerPurchasedTicket, $buyerexcludedZipCode, $buyerexcludedDevices) {
$query->whereIn('appliance_id', $userAppliances);
$query->whereIn('brand_id', $userBrands);
// $query->whereNotIn('id', $buyerPurchasedTicket);
$query->whereNotIn('brand_id', $buyerexcludedDevices);
$query->whereNotIn('zip_code_id', $buyerexcludedZipCode);
})
->when($request->filters['brand_ids'], fn ($q) => $q->whereIn('brand_id', $request->filters['brand_ids']))
->when($request->filters['appliance_ids'], fn ($q) => $q->whereIn('appliance_id', $request->filters['appliance_ids']))
->when($request->filters['province_ids'], fn ($q) => $q->whereIn('province_id', $request->filters['province_ids']))
->when($request->price, fn ($q) => $q->whereBetween('price', [$request->min_price, $request->max_price]))
->orderBy('tickets.created_at', $request->order ?? 'desc')
->groupBy('ticket_statuses.status_id')
->paginate($request->rows ?? 30)
)
->response()->getData(true);
When I run the above code I get the following error
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'project.tickets.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select count() as aggregate from (select
tickets. fromticketsinner jointicket_statusesontickets.id=ticket_statuses.ticket_idwhere exists (select * fromticket_statusesinner join (select MAX(ticket_statuses.id) asid_aggregate,ticket_statuses.ticket_idfromticket_statusesgroup byticket_statuses.ticket_id) aslatestOfManyonlatestOfMany.id_aggregate=ticket_statuses.idandlatestOfMany.ticket_id=ticket_statuses.ticket_idwheretickets.id=ticket_statuses.ticket_idandstatus_idin (1, 2)) and (appliance_idin (1, 2, 3) andbrand_idin (1, 2, 3) and 1 = 1 and 1 = 1) group byticket_statuses.status_id) asaggregate_table)"