laravel query builder with conditions laravel query builder with conditions php php

laravel query builder with conditions


Follow please Laravel:Collection:GroupBy

So it's maybe you need to have a code look like this

$join = $this->tickets();$tickets = $join         ->when($category, function($query) use ($category) {             $ranges = $this->dateRange($category);             return $query->whereBetween('tickets.created_at', $ranges);         })         ->select(DB::raw('COUNT(tickets.id) as tickets'), 'ticket_status.name as name', 'tickets.created_at')         ->get()->groupBy(/** YOUR LOGIC HERE  **/);


You'll need to convert this to Laravel/Eloquent, but this is a raw db query that does what you're looking for.

Assumed Tables / Data

Table: tbl_datesid | date1    2016-11-17 00:00:002    2016-11-18 00:00:00...etc...Table: ticketsid | created_at1    2016-11-18 12:34:562    2016-11-18 01:23:453    2016-11-18 02:34:56Table: ticket_statusticket_id | name1           Open2           Closed3           Closed

Query:

SELECT   COUNT(tickets.id) AS tickets,  ticket_status.name,   DATE(tbl_dates.date) AS ticket_dateFROM   tbl_datesLEFT JOIN   tickets ON  (DATE(tbl_dates.date) = DATE(tickets.created_at))LEFT JOIN  ticket_statusON  (tickets.id = ticket_status.ticket_id)GROUP BY   ticket_status.nameORDER BY   ticket_dateASC

Result:

 tickets | name | ticket_date 0         NULL   2016-11-17 1         Open   2016-11-18 2         Closed 2016-11-18

Basically, to do this in pure MySQL you need a table with all dates. Check out this SO post for an easy way to generate the dates table.


Use MySQL's date function to format the date first and then group by the formatted date:

So your query should look something like this:

$join = $this->tickets();    $tickets = $join            ->when($category, function($query) use ($category) {                $ranges = $this->dateRange($category);                return $query->whereBetween('tickets.created_at', $ranges);            })            ->select(DB::raw('COUNT(tickets.id) as tickets'), 'ticket_status.name as name', DB::raw('DATE('tickets.created_at') as created_date'))            ->groupBy('ticket_status.name', 'created_date')            ->get();