2016-11-16 5 views
7

Ich bin eine Abfrage implementieren, um ein mehrzeiliges Diagramm mit chartjs zu zeichnen. Ich habe eine Reihe von Terminenlaravel Query Builder mit Bedingungen

["2016-10-16","2016-10-17","2016-10-18","2016-10-19","2016-10-20","2016-10-21","2016-10-22","2016-10-23","2016-10-24","2016-10-25","2016-10-26","2016-10-27","2016-10-28","2016-10-29","2016-10-30","2016-10-31","2016-11-01","2016-11-02","2016-11-03","2016-11-04","2016-11-05","2016-11-06","2016-11-07","2016-11-08","2016-11-09","2016-11-10","2016-11-11","2016-11-12","2016-11-13","2016-11-14","2016-11-15","2016-11-16"] 

Dieses Array hat Termine zwischen „2016.11.16“ und „2016.10.16“.

Ich habe ein Modell ‚Tickets‘ erstellt, und ich schrieb eine Abfrage Tickets holen von tickets.status gruppiert Zählung

$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') 
       ->groupBy('ticket_status.name', 'tickets.created_at') 
       ->get(); 

Wenn ich diese Abfrage ausführen ich

bekam
[ 
{ 
"tickets":"1", 
"name":"Closed", 
"created_at":"2016-11-08 14:07:32" 
}, 
{ 
"tickets":"1", 
"name":"Open", 
"created_at":"2016-11-08 14:07:32" 
}, 
{ 
"tickets":"1", 
"name":"Open", 
"created_at":"2016-11-11 12:24:39" 
}, 
{ 
"tickets":"1", 
"name":"Open", 
"created_at":"2016-11-11 12:26:38" 
}, 
{ 
"tickets":"1", 
"name":"Open", 
"created_at":"2016-11-11 12:27:04" 
}, 
{ 
"tickets":"1", 
"name":"Open", 
"created_at":"2016-11-11 12:27:49" 
}, 
{ 
"tickets":"1", 
"name":"Open", 
"created_at":"2016-11-11 12:28:47" 
}, 
{ 
"tickets":"1", 
"name":"Resolved", 
"created_at":"2016-11-08 14:07:32" 
} 
] 

Wenn $label[0] != $tickets.created , ticket und name sind null, sollten aber das Datum haben

Bitte helfen Sie mir wie

0 ausgegeben werden
[ 
[ 
'tickets'=>0, 
'name'=>null,//tickets don't have this date 
'created_at'=>'2016-10-16' 
], 
[ 
'tickets'=>0, 
'name'=>null,//tickets don't have this date 
'created_at'=>'2016-10-15' 
], 
[ 
'tickets'=>1, 
'name'=>'closed',//on this date 1 closed ticket 
'created_at'=>'2016-10-14' 
], 
[ 
'tickets'=>3, 
'name'=>'open',//on this date 3 open ticket 
'created_at'=>'2016-10-14' 
], 
[ 
'tickets'=>2, 
'name'=>'resolved',//on this date 2 resolved ticket 
'created_at'=>'2016-10-14'// on 2016-10-14 has three different tickets 
], 
........... 
] 

Bitte helfen Sie mir, eine Lösung zu finden. Danke im Voraus.

+0

Sie müssen suchen Ihre Daten Trog gehen und dann:

So Ihre Abfrage wie folgt aussehen sollte für alle Tickets, die mit diesem Datum übereinstimmen. – Roadirsh

+1

Sie können 'FORMAT (created_at, 'YYYY-MM-DD')' auch in Ihrem SQL verwenden und dann etwas wie: 'array_search ($ date, array_column ($ tickets, 'created_at'));' – Roadirsh

Antwort

0

Sie müssen dies in Laravel/Eloquent konvertieren, aber dies ist eine rohe DB-Abfrage, die das tut, was Sie suchen.

Angenommene Tabellen/Daten

Table: tbl_dates 
id | date 
1 2016-11-17 00:00:00 
2 2016-11-18 00:00:00 
...etc... 

Table: tickets 
id | created_at 
1 2016-11-18 12:34:56 
2 2016-11-18 01:23:45 
3 2016-11-18 02:34:56 

Table: ticket_status 
ticket_id | name 
1   Open 
2   Closed 
3   Closed 

Abfrage:

SELECT 
    COUNT(tickets.id) AS tickets, 
    ticket_status.name, 
    DATE(tbl_dates.date) AS ticket_date 
FROM 
    tbl_dates 
LEFT JOIN 
    tickets 
ON 
    (DATE(tbl_dates.date) = DATE(tickets.created_at)) 
LEFT JOIN 
    ticket_status 
ON 
    (tickets.id = ticket_status.ticket_id) 
GROUP BY 
    ticket_status.name 
ORDER BY 
    ticket_date 
ASC 

Ergebnis:

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

Im Grunde ist dies in reiner MySQL zu tun, müssen Sie eine Tabelle mit allen Terminen. Check out this SO post for an easy way to generate the dates table.

0

Verwenden von MySQL date function das Datum zu formatieren und dann Gruppe durch das formatierte Datum:

$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();