Yêu cầu thg 8 25, 2021 6:51 SA 119 0 4
  • 119 0 4
0

Hỏi về eloquent trong laravel

Chia sẻ
  • 119 0 4

Em có bảng History lưu trữ thông tin. Em muốn đọc data từ bảng ra theo 12 tháng. Ví dụ năm nay là 2021. Input là 2021 output là 12item tương đương với 12 tháng. Nhưng hiện tại mới là tháng 8 thì chỉ đọc ra đc 8 tháng, em muốn 4 tháng còn lại vẫn đọc ra và giá trị của nó bằng 0. Có cách nào không ạ. Em cảm ơn

4 CÂU TRẢ LỜI


Đã trả lời thg 8 25, 2021 1:58 CH
Đã được chấp nhận
0

// Đây là ví dụ của mình bạn có thể tham khảo thử

     function get HistoryByYear($year) {
        $months = [];
        for($i = 0; $i < 12; $i++) {
            $months[] = History::whereYear('created_at', $year)
                ->whereMonth('created_at', $i)
                ->get()->toArray();
        }
        return $months;
    } 
Chia sẻ
Avatar nonono @lehuyvuong
thg 8 27, 2021 3:41 SA

Cách làm ở trên vẫn chạy tốt nhưng sẽ chạy tận 12 câu query. Bạn thử get data groupBy theo tháng. Sau đó tạo thêm 1 cái array từ tháng 1 đến tháng 12. Rồi xét index. cái nào k trùng index với data đã lấy ra thì cho nó bằng 0 thử xem sao

thg 8 29, 2021 4:52 CH
Avatar PHAM HIEU @pviethieu
thg 9 6, 2021 7:06 SA

@lehuyvuong đồng quan điểm ! nên dùng groupBy + dùng array để check và merge data vào

Đã trả lời thg 9 2, 2021 3:56 SA
+2

Mình thấy là dữ liệu bạn đọc ra từ CSDL bằng Eloquent là dạng Collection, nếu bạn muốn thêm 4 tháng còn lại thì chỉ cần add thêm data vào Collection bằng phương thức put là được, bạn có thể xem cách sử dụng của phương pháp này ở link này nha https://laravel.com/docs/8.x/collections#method-put. Nhưng theo mình thì việc đọc ra 8 tháng và hiển thị ra 8 tháng hợp lí hơn mà nhỉ, hiển thị 12 tháng và để rỗng nó không có ý nghĩa nhiều lắm.

Chia sẻ
Đã trả lời thg 8 29, 2021 4:53 CH
0
History::whereYear('created_at', $year)->groupBy(function($d) {
     return Carbon::parse($d->created_at)->format('m');
 })->get();
Chia sẻ
Avatar CongHD @conghdql4
thg 8 30, 2021 8:52 SA
Đã trả lời thg 8 30, 2021 8:57 SA
0
 SELECT t2.month, COUNT(t1.id) FROM histories t1
RIGHT JOIN (
   SELECT 1 AS month UNION ALL SELECT 2 UNION ALL  SELECT 3  UNION ALL  SELECT 4 UNION ALL SELECT 5  UNION ALL SELECT 6 UNION ALL  SELECT 7 UNION ALL  SELECT 8 UNION ALL  SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) t2
   ON MONTH(t1.created_at) = t2.month AND YEAR (t1.created_at) = 2020
group by  t2.month;

Bạn có thể tham khảo SQL để convert sang ELOQUENT hoạc dùng DB RAW để lấy dữ liệu

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí