2016-11-16 17 views
7

Tôi đang triển khai truy vấn để vẽ biểu đồ nhiều đường bằng cách sử dụng biểu đồj. Tôi có một loạt các ngàyTrình tạo truy vấn laravel với điều kiện

["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"] 

Mảng này có ngày giữa "2016-11-16" và "2016-10-16".

Tôi đã tạo ra 'Vé' một mô hình, và tôi đã viết một truy vấn để lấy vé đếm được phân nhóm theo tickets.status

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

Khi tôi thực hiện truy vấn này tôi đã

[ 
{ 
"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" 
} 
] 

Nếu $label[0] != $tickets.created , vé và tên sẽ là null nhưng phải có ngày

Vui lòng giúp tôi để có được kết quả như

[ 
[ 
'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 
], 
........... 
] 

Vui lòng giúp tôi tìm giải pháp. Cảm ơn trước.

+0

Bạn cần phải đi trough ngày của bạn và sau đó tìm kiếm cho tất cả các vé khớp với ngày đó. – Roadirsh

+1

Bạn có thể sử dụng 'FORMAT (created_at, 'YYYY-MM-DD')' trong SQL của bạn cũng như sau: 'array_search ($ date, array_column ($ tickets, 'created_at'));' – Roadirsh

Trả lời

0

Bạn cần chuyển đổi thành Laravel/Eloquent, nhưng đây là truy vấn db thô thực hiện những gì bạn đang tìm kiếm.

Giả Bàn/Dữ liệu

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 

Query:

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 

Kết quả:

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

Về cơ bản, để làm điều này trong tinh khiết MySQL bạn cần một bảng với tất cả các ngày. Check out this SO post for an easy way to generate the dates table.

0

Sử dụng MySQL của date function để định dạng ngày đầu tiên và sau đó nhóm của ngày định dạng:

Vì vậy, câu hỏi của bạn nên tìm một cái gì đó như thế này:

$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(); 
Các vấn đề liên quan